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
交易,然后做闪光。