一、基本概念:tableView的cell在显示的过程是先计算行高,然后再返回cell到界面显示。tableView是继承自UIScrollView
设置行高有两种方式:一种通过tableView.rowHeight直接设置行高,这种方式的效率最高。但是返回的行高都是一样的,如果要求返回的行高不一样则需要第二种方式:通过实现代理方法动态返回每一行的行高。
提示:如果表格高度是固定的,一定不要通过代理返回行高!可以直接设置属性!!
数据源执行的顺序
有预估行高
1>行数,知道多少行,根据预估行高(tableView.estimatedRowHeight),计算整个
tableView 的预估 contentSize,
保证能够滚动
2>数据源cell,获取要显示的 cell,会直接调用行高方法,返回当前行的高度
3>行高
2.3 会重复调用,一直到超出当前屏幕位置contentSize会有一个变化,显示的行会用计算好的行高,没有显示的行,仍然用预估行高,如果都滚动完成,contentSize才是一个准确的值
好处,提前计算的数据量小
缺点,滚动过程中,临时计算行高,如果行高计算过于复杂,会影响性能!
没有预估行高
1>行数,知道有多少行
2>行高,计算每一行的行高,累加,就能够得到contentSize的 height
3>数据源cell,当 cell显示的时候,整个 tableView的 contentSize已经计算完毕,能够保证快速滚动!
重点:UITableView
是继承自 UIScrollView,滚动依赖于 contentSize
tableView.cellForRowAtIndexPath(indexPath)
通常是在表格的其他代理方法,例如:选中行中根据索引获取 cell
注意:调用的时候,cell一定已经被创建出来!因为在计算行高的时候,cell还没有被创建出来,所以不能使用此方法。一般使用
tableView.dequeueReusableCellWithIdentifier("Cell")
二、在数据不断更新中,需要对tableview的单行数据进行刷新或者操作,可以通过tableView的reloadData方法我们可以方便的对tableVie的cell根据数据源进行刷新。但是这种刷新方法在某些时候也不是那么合适。比如只需要更新几行的时候可能显得多余。同时在tableView较为复杂的时候还会产生性能的问题。在这种时候我们可以使用tableView的begin Updates方法和end Updates方法来对tableView的几行数据进行增删改和对cell的位置移动。系统会自动给我们的操作加上动画。
2.1 TableView进行插入cell操作
2.1.1 只进行tableView的插入代码如下:
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
[self.listArrM insertObject:@"插入新的cell" atIndex:0];
[self.tableView endUpdates];
[CATransaction commit];
2.1.2.添加Transaction事务代码如下
[CATransaction begin];
[CATransaction setCompletionBlock:^{
NSLog(@"插入cell完成");
}];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
[self.listArrM insertObject:@"插入新的cell" atIndex:0];
[self.tableView endUpdates];
[CATransaction commit];
2.1.3 设置动画延时、持续时间、并且设置动画类型可以使用如下代码
[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionShowHideTransitionViews animations:^{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
NSLog(@"插入cell完成");
}];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
[self.listArrM insertObject:@"插入新的cell" atIndex:0];
[self.tableView endUpdates];
[CATransaction commit];
} completion:^(BOOL finished) {
NSLog(@"动画执行完毕");
}];
同时代码的执行顺序如下
2017-11-12 15:54:14.219972+0800 TableViewBeginEndUpdates[2400:84658] 插入cell完成
2017-11-12 15:54:14.220563+0800 TableViewBeginEndUpdates[2400:84658] 动画执行完毕
2.2 tableView进行删除cell操作
[UIView animateKeyframesWithDuration:1 delay:0 options:UIViewKeyframeAnimationOptionLayoutSubviews animations:^{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
}];
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[self.listArrM removeObjectAtIndex:0];
[self.tableView endUpdates];
[CATransaction commit];
} completion:^(BOOL finished) {
}];
2.3 tableView进行修改cell操作
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAutoreverse animations:^{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
}];
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
[self.listArrM replaceObjectAtIndex:0 withObject:@"修正后的cell"];
[self.tableView endUpdates];
[CATransaction commit];
} completion:^(BOOL finished) {
}];
2.4 tableView进行移动cell操作
[UIView animateKeyframesWithDuration:1 delay:0 options:UIViewKeyframeAnimationOptionAutoreverse animations:^{
} completion:^(BOOL finished) {
[CATransaction begin];
[CATransaction setCompletionBlock:^{
}];
[self.tableView beginUpdates];
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]];
NSString *str = self.listArrM[0];
[self.listArrM removeObjectAtIndex:0];
[self.listArrM insertObject:str atIndex:2];
[self.tableView endUpdates];
[CATransaction commit];
}];
大千世界,求同存异;相遇是缘,相识是份,相知便是“猿粪”(缘分)
From MZou