先看Apple API Reference中对这两个方法的描述
beginUpdates
endUpdates
从上述描述中我们大概可以总结出四点
1、beginUpdates 和 endUpdates必须成对使用
2、使用beginUpdates和endUpdates可以在改变一些行(row)的高度时自带动画,并且不需要Reload row(不用调用cellForRow,仅仅需要调用heightForRow,这样效率最高)。
3、在beginUpdates和endUpdates中执行insert,delete,select,reload row时,动画效果更加同步和顺滑,否则动画卡顿且table的属性(如row count)可能会失效。
4、在beginUpdates 和 endUpdates中执行 reloadData 方法和直接reloadData一样,没有相应的中间动画。
针对上面几点举几个栗子
1、改变Row的高度
直接调用
[self.tableViewbeginUpdates];
[self.tableViewendUpdates];
接着tableview回调-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath,调整每一行的高度。
2、同时insert,delete,select reload
[self.tableViewbeginUpdates];
[self.testArrayinsertObject:@(-1)atIndex:0];
[self.tableViewinsertRowsAtIndexPaths:@[[NSIndexPathindexPathForRow:0inSection:0]]withRowAnimation:UITableViewRowAnimationAutomatic];
[self.testArrayremoveObjectAtIndex:3];
[self.tableViewdeleteRowsAtIndexPaths:@[[NSIndexPathindexPathForRow:2inSection:0]]withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableViewselectRowAtIndexPath:[NSIndexPathindexPathForRow:3inSection:0]animated:YESscrollPosition:UITableViewScrollPositionMiddle];
[self.tableViewreloadRowsAtIndexPaths:@[[NSIndexPathindexPathForRow:4inSection:0]]withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableViewendUpdates];
如何在做完动画之后执行某个方法呢?
[CATransactionbegin];
[CATransactionsetCompletionBlock:^{
NSLog(@"aferCompletionBlock");
}];
[self.tableViewbeginUpdates];
[self.tableViewendUpdates];
[CATransactioncommit];
如何控制动画的执行时间呢?
[UIViewanimateWithDuration:2.0fdelay:0.0options:UIViewAnimationOptionCurveEaseInOutanimations:^{
[CATransactionbegin];
[CATransactionsetCompletionBlock:^{
NSLog(@"after2");
}];
[self.tableViewbeginUpdates];
[self.tableViewendUpdates];
[CATransactioncommit];
NSLog(@“after1”);
}completion:^(BOOLfinished) {
NSLog(@"after3");
}];
输出顺序: after1->after2->after3
利用UIView的动画的执行时间来控制beginUpdates和endUpdates的动画时间。