ios 常用知识点详解

OC: UITableView 使用 reloadSection

2021-10-24  本文已影响0人  阳光下的叶子呵

尤其是在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;
}
因为tableviewloadreload,是先根据预估行高做一个轮廓的搭建,再把自定义的数据填充进去做高度的微调。所以假如不做预先的设置,默认是根据UITableViewAutomaticDimension做预估行高的(好像是44),这样的渲染导致了界面抖动,甚至到时scrollView上移或下移。

因此需要在init方法中设置 预估行高,
并尽量确保 预估行高 和heightForRowAtIndexPathheightForHeaderInSectionheightForFooterInSection中返回值保持一致。
这样做的好处是去除渲染时的界面抖动,同时提高界面渲染的性能。

上一篇下一篇

猜你喜欢

热点阅读