UITableView行animation持续时间和完成callback

有没有办法指定UITableView行animation的持续时间,或者animation完成时获得callback?

我想要做的是在animation完成后闪动滚动指示器。 之前做闪光灯什么也不做。 到目前为止,我的解决方法是延迟半秒(这似乎是默认的animation持续时间),即:

[self.tableView insertRowsAtIndexPaths:newRows withRowAnimation:UITableViewRowAnimationFade]; [self.tableView performSelector:@selector(flashScrollIndicators) withObject:nil afterDelay:0.5]; 

刚刚碰到这个。 以下是如何做到这一点:

Objective-C的

 [CATransaction begin]; [tableView beginUpdates]; [CATransaction setCompletionBlock: ^{ // Code to be executed upon completion }]; [tableView insertRowsAtIndexPaths: indexPaths withRowAnimation: UITableViewRowAnimationAutomatic]; [tableView endUpdates]; [CATransaction commit]; 

迅速

 CATransaction.begin() tableView.beginUpdates() CATransaction.setCompletionBlock { // Code to be executed upon completion } tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) tableView.endUpdates() CATransaction.commit() 

请注意,在iOS 7上,使用UIViewanimation围绕CATransaction可以控制表格animation的持续时间。

 [UIView beginAnimations:@"myAnimationId" context:nil]; [UIView setAnimationDuration:10.0]; // Set duration here [CATransaction begin]; [CATransaction setCompletionBlock:^{ NSLog(@"Complete!"); }]; [myTable beginUpdates]; // my table changes [myTable endUpdates]; [CATransaction commit]; [UIView commitAnimations]; 

UIViewanimation的持续时间对iOS 6没有影响。也许iOS 7的桌面animation在UIView级别上以不同的方式实现。

缩短布伦特的罚款答案 ,至less在iOS 7中,你可以把这一切简单地[UIView animateWithDuration:delay:options:animations:completion:] call:

 [UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ [self.tableView beginUpdates]; [self.tableView endUpdates]; } completion:^(BOOL finished) { // completion code }]; 

虽然,我似乎无法重写从EaseInOut以外的任何其他的默认animation曲线。

这是karwag答案的Swift版本

  CATransaction.begin() tableView.beginUpdates() CATransaction.setCompletionBlock { () -> Void in // your code here } tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) tableView.endUpdates() CATransaction.commit() 

这是一个有用的技巧! 我写了一个UITableView扩展来避免一直写CATransaction的东西。

 import UIKit extension UITableView { /// Perform a series of method calls that insert, delete, or select rows and sections of the table view. /// This is equivalent to a beginUpdates() / endUpdates() sequence, /// with a completion closure when the animation is finished. /// Parameter update: the update operation to perform on the tableView. /// Parameter completion: the completion closure to be executed when the animation is completed. func performUpdate(_ update: ()->Void, completion: (()->Void)?) { CATransaction.begin() CATransaction.setCompletionBlock(completion) // Table View update on row / section beginUpdates() update() endUpdates() CATransaction.commit() } } 

这是这样使用的:

 // Insert in the tableView the section we just added in sections self.tableView.performUpdate({ self.tableView.insertSections([newSectionIndex], with: UITableViewRowAnimation.top) }, completion: { // Scroll to next section let nextSectionIndexPath = IndexPath(row: 0, section: newSectionIndex) self.tableView.scrollToRow(at: nextSectionIndexPath, at: .top, animated: true) }) 

对于我来说,我需要一个collectionView。 我已经做了一个简单的扩展来解决这个问题:

 extension UICollectionView { func reloadSections(sections: NSIndexSet, completion: () -> Void){ CATransaction.begin() CATransaction.setCompletionBlock(completion) self.reloadSections(sections) CATransaction.commit() } } 

覆盖tableView -insertRowsAtIndexPaths:并实现您想要的自定义插入/(或用其自己的方法删除)animation。 尽pipe我没有尝试过。

您可以尝试将insertRowsAtIndexPath包装在一个

 - (void)beginUpdates - (void)endUpdates 

交易,然后做闪光。