UITableView cells animation on scroll. Swift

Viewed 211
1 Answers

This gives something similar to what you want. You might need to make adjustments to it or improve the code snippet. You can work with the panGestureRecognizer property of the tableView

tableView.panGestureRecognizer.addTarget(self, action: #selector(didPan(_:)))

With this handler:


    @objc func didPan(_ gesture: UIPanGestureRecognizer) {
        guard gesture.state == .changed else { return }

        let loc = gesture.location(in: tableView)
        guard let touchedCellIndex = tableView.indexPathForRow(at: loc) else { return }
        let n = tableView.numberOfRows(inSection: 0)
        guard touchedCellIndex.row < n - 1 else { return }
        
        if gesture.translation(in: tableView).y < 0 {
            for (index, cell) in tableView.visibleCells.enumerated() {
                guard let ip = tableView.indexPath(for: cell) else { return }
                if ip.row > touchedCellIndex.row {
                    cell.transform = CGAffineTransform(translationX: 0.0, y: -gesture.velocity(in: tableView).y * 0.02 * tanh(CGFloat(index)))
                    UIView.animate(withDuration: 0.05 * Double(index), delay: 0.0) {
                        cell.transform = CGAffineTransform.identity
                    }
                }
                
            }
        } else {
            for (index, cell) in tableView.visibleCells.reversed().enumerated() {
                guard let ip = tableView.indexPath(for: cell) else { return }
                if ip.row < touchedCellIndex.row {
                    cell.transform = CGAffineTransform(translationX: 0.0, y: -gesture.velocity(in: tableView).y * 0.02 * tanh(CGFloat(index)))
                    UIView.animate(withDuration: 0.05 * Double(index), delay: 0.0) {
                        cell.transform = CGAffineTransform.identity
                    }
                }
                
            }
        }
    }
     

I am sure you can optimize this approach and make it more concise.

Related