Search code examples
iosuitableviewanimationcell

Table view cell load animation one after another


I need to animate the load of the table view rows. When the table reloads the data I need the rows get in from the left one after another. How can I achieve this?


Solution

  • In your tableview delegate,

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    

    Put this bottom-to-top fade-in translation animation (Simplified from Anbu.Karthik answer),

        //1. Define the initial state (Before the animation)
        cell.transform = CGAffineTransformMakeTranslation(0.f, CELL_HEIGHT);
        cell.layer.shadowColor = [[UIColor blackColor]CGColor];
        cell.layer.shadowOffset = CGSizeMake(10, 10);
        cell.alpha = 0;
    
        //2. Define the final state (After the animation) and commit the animation
        [UIView beginAnimations:@"rotation" context:NULL];
        [UIView setAnimationDuration:0.5];
        cell.transform = CGAffineTransformMakeTranslation(0.f, 0);
        cell.alpha = 1;
        cell.layer.shadowOffset = CGSizeMake(0, 0);
        [UIView commitAnimations];
    

    For better UX, it is advised that the animation should only be played once for each row, until the table view is dealloc-ed.

    Put the above code in

    if (![self.shownIndexes containsObject:indexPath]) {
        [self.shownIndexes addObject:indexPath];
    
        // Your animation code here.
    }
    

    ------- Swift -----------------------------------------------------------------------------------------------------------------

    var shownIndexes : [IndexPath] = []
    let CELL_HEIGHT : CGFloat = 40
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if (shownIndexes.contains(indexPath) == false) {
            shownIndexes.append(indexPath)
    
            cell.transform = CGAffineTransform(translationX: 0, y: CELL_HEIGHT)
            cell.layer.shadowColor = UIColor.black.cgColor
            cell.layer.shadowOffset = CGSize(width: 10, height: 10)
            cell.alpha = 0
    
            UIView.beginAnimations("rotation", context: nil)
            UIView.setAnimationDuration(0.5)
            cell.transform = CGAffineTransform(translationX: 0, y: 0)
            cell.alpha = 1
            cell.layer.shadowOffset = CGSize(width: 0, height: 0)
            UIView.commitAnimations()
        }
    }