// Make the table invisible, then reload its data
self.tableView.alpha = 0.0f;
[self.tableView reloadData];

// Store a delta timing variable so I can tweak the timing delay
// between each row’s animation and some additional 
CGFloat diff = .05;
CGFloat tableHeight = self.tableView.bounds.size.height;
NSArray *cells = [self.tableView visibleCells];

// Iterate across the rows and translate them down off the screen
for (NSUInteger a = 0; a < [cells count]; a++) {
    UITableViewCell *cell = [cells objectAtIndex:a];
    if ([cell isKindOfClass:[UITableViewCell class]]) {

        // Move each cell off the bottom of the screen by translating its Y position
        cell.transform = CGAffineTransformMakeTranslation(0, tableHeight);
    }
}

// Now that all rows are off the screen, make the tableview opaque again
self.tableView.alpha = 1.0f;

// Animate each row back into place
for (NSUInteger b = 0; b < [cells count]; b++) {
    UITableViewCell *cell = [cells objectAtIndex:b];
	
    [UIView animateWithDuration:1.6 delay:diff*b usingSpringWithDamping:0.77
        initialSpringVelocity:0 options:0 animations:^{
        cell.transform = CGAffineTransformMakeTranslation(0, 0);
     } completion:NULL];
}