OC: UITableView 使用 reloadSection
尤其是在UITableViewCell
中放入UITextView
输入文字动态刷新Cell高度的时候,会跳动的问题, 以及在使用reloadSections
去刷新tableView
的某个section
的时候
不同系统下可能表现的不一样, 尤其我实在iPad 11.4的发现的问题, 而iPhone的11.4就没问题. 很奇怪 , 所有尝试了各种方法去解决
下面是尝试过的方法...
刷新section
:
// 1
[self.tableView beginUpdates];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
// 2
[UIView performWithoutAnimation:^{
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];
// 3
[self.tableView performBatchUpdates:^{
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
} completion:^(BOOL finished) {}];
// 4
[self.tableView beginUpdates];
[self.tableView performBatchUpdates:^{
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
} completion:^(BOOL finished) {}];
[self.tableView endUpdates];
刷新单个cell
:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:1];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
然后在网上看到了这个方法:
iOS11默认开启Self-Sizing
如果你没用到预估高度 那么你尝试在Appdelegate.m
中的didFinishLaunchingWithOptions
方法中,加上如下代码,看看是否有效
也可以放在UITableView
的初始化或者懒加载中
if (@available(iOS 11.0, *)) {
UITableView.appearance.estimatedRowHeight = 0;
UITableView.appearance.estimatedSectionFooterHeight = 0;
UITableView.appearance.estimatedSectionHeaderHeight = 0;
}
因为tableview
的load
和reload
,是先根据预估行高做一个轮廓的搭建,再把自定义的数据填充进去做高度的微调。所以假如不做预先的设置,默认是根据UITableViewAutomaticDimension
做预估行高的(好像是44),这样的渲染导致了界面抖动,甚至到时scrollView
上移或下移。
因此需要在init
方法中设置 预估行高,
并尽量确保 预估行高 和heightForRowAtIndexPath
、heightForHeaderInSection
、heightForFooterInSection
中返回值保持一致。
这样做的好处是去除渲染时的界面抖动,同时提高界面渲染的性能。