Search code examples
iosswiftobjective-cxcodeios-animations

UITableView cells animation on scroll. Swift


Community, please help out a beginner! Can you tell me how to make such animation for TableView cells? Thank!

cell animation as in this video with Swift


Solution

  • 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.