美文网首页
UItableview滑动抖动和刷新位置上移

UItableview滑动抖动和刷新位置上移

作者: 哥只是个菜鸟 | 来源:发表于2021-04-27 10:36 被阅读0次
    1.抖动问题:使用系统方法自动布局会造成来回切换页面数据刷新时,上下滑动会一直抖动,设置header和footer的预估高度只适用于一种header或footer的高度,如果有多种header或者footer高度不断变化,就会抖动,亲测有效。其实说到底我们的需求大部分只需要设置cell的自动布局就OK了,cell的控件比较多的情况,手动计算很繁琐,只不过是header和footer的预估高度默认就是自动布局了,我们页不会去想到是这个原因,还以为是cell的自动布局导致的抖动,那这样就直接设置header和footer的预估高度等于0禁用掉,然后在代理方法里面设置高度即可,cell的高度计算还是可以使用UITableViewAutomaticDimension计算的。
    • 原来的代码:
     _tableView.estimatedRowHeight = 120.f;
     _tableView.estimatedSectionHeaderHeight = 50.f;
     _tableView.estimatedSectionFooterHeight = 60.f;
     _tableView.rowHeight = UITableViewAutomaticDimension;
    
    \color{red}{更正一下:这边最后发现是estimatedSectionHeaderHeight和estimatedSectionFooterHeight导致的抖动问题} \color{red}{禁用header和footer的预估高度(设置为0)可以保证不抖动},

    \color{red}{cell设置estimatedRowHeight的预估高度,使用自动布局即可}

    • 修改后
     _tableView.estimatedRowHeight = 120.f;
     _tableView.estimatedSectionHeaderHeight = 0;
     _tableView.estimatedSectionFooterHeight = 0;//禁用掉或者准确的设置高度,否则都会造成抖动
     _tableView.rowHeight = UITableViewAutomaticDimension;
    
    其他的方法:好像不太适用我的页面,因为我这个tableview有2段接口数据分开加载显示的
    // declare cellHeightsDictionary
    NSMutableDictionary *cellHeightsDictionary;
     
    // initialize in code (thanks to @Gerharbo)
    cellHeightsDictionary = @{}.mutableCopy;
     
    // declare table dynamic row height and create correct constraints in cells
    tableView.rowHeight = UITableViewAutomaticDimension;
     
    // save height
    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
        [cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath];
    }
     
    // give exact height value
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSNumber *height = [cellHeightsDictionary objectForKey:indexPath];
        if (height) return height.doubleValue;
        return UITableViewAutomaticDimension;
    }
    
    2.当我滑动到当前cell时,点击上面的按钮重新加载数据刷新页面,发现整个tableview自动滑到最顶部了,我想要的效果刷新后继续停在当前cell。后面发现是因为[tableView reloadData]方法的时机不太对造成的,恰好刷新时数据源被清空或者数据源的数量改变了,所以一定要在整个数据源赋值完成之后再对整个tableview进行reload,或者只影响当前cell只刷新当前cell的方法就ok了,我这个是对整个页面的数据都有影响所以才使用[tableView reloadData]方法

    相关文章

      网友评论

          本文标题:UItableview滑动抖动和刷新位置上移

          本文链接:https://www.haomeiwen.com/subject/dplurltx.html