UITableView beginUpdates/endUpdates 同时滚动使滚动跳转

Posted

技术标签:

【中文标题】UITableView beginUpdates/endUpdates 同时滚动使滚动跳转【英文标题】:UITableView beginUpdates/endUpdates while scrolling makes scroll jump 【发布时间】:2019-03-14 13:40:47 【问题描述】:

我的UITableView 需要显示来自服务器的一些图像。 UITableViewCell由单个UIImageViewNSLayoutConstraint组成,高度为UIImageView

在视图控制器的cellForRowAtIndexPath 中,它从服务器获取图像并将图像调整为适合屏幕的宽度。一件重要的事情是图像需要保持纵横比,所以我编写了一个代码来获得保持纵横比的图像高度。高度应用于布局约束,即图像视图的高度。

除非我调用 [tableView beginUpdates][tableView endUpdates] 方法,否则单元格不会调整大小,因此我会在加载单元格的每个图像后调用这些方法。问题是当用户在获取图像时滚动表格视图并且正在调用beginUpdatesendUpdates 方法时,滚动会跳转到某个点。 (我不确定表格视图跳转到哪里)

这是我试图防止跳跃的原因:

- (void)resizeCellHeight 
    [UIView performWithoutAnimation:^
        self->currentScrollY = self.tableView.contentOffset.y;

        [self.tableView beginUpdates];
        [self.tableView endUpdates];

        self->currentScrollY = -1;
    ];



- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    if(currentScrollY != -1) 
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, currentScrollY) animated:NO];
    

有时它有效,但不是 100%。这段代码有时甚至会阻止减速并继续跳跃。

有没有办法防止滚动视图跳跃?还是更好的计算细胞的方法?

【问题讨论】:

【参考方案1】:

在 cellForRow 中获取数据不正确。这很耗时,而且您正在阻塞主线程。

所有与服务器相关的项目必须在另一个线程上完成,完成后您重新加载 tableView(或其中的特定项目)。

如果您知道图像大小,则可以使用 imageView 中图像的大小创建单元格,然后在从服务器获得该行的数据后使用 [tableView reloadAtIndexPaths:] 刷新单元格。

要保持纵横比,只需将 imageView 的 contentMode 设置为 .aspectFit。

要全面回答您的问题,您需要重新考虑流程。将与服务器相关的所有内容移到另一个线程上。当项目可用时,重新加载单元格。尝试创建具有固定大小的单元格,并在拥有数据时刷新它。将 imageView contentMode 设置为 aspectFit。

【讨论】:

所以我实现了异步获取过程,我需要在表格视图中显示一些图像,所以加载后显示看起来不是一个好的解决方案 那么你的方法是什么?您在屏幕上显示单元格的大小并在用户面前调整它们的大小?你会使用这样的应用程序吗?以 Facebook 为例,如果您的互联网连接不佳,您会在图像上看到白色,并且当准备好时,他们只需刷新 tableView。尽快展示内容developer.apple.com/design/human-interface-guidelines/ios/…

以上是关于UITableView beginUpdates/endUpdates 同时滚动使滚动跳转的主要内容,如果未能解决你的问题,请参考以下文章

执行“beginUpdates”“endUpdates”时 UITableView 页脚视图的动画问题

UITableView 意外反弹 beginUpdates()/endUpdates()/performBatchUpdates()

UITableView beginUpdates/endUpdates 回调

UITableView "beginUpdates" 和 UICollectionView "performBatchUpdates" 是不是具有相同的行为?

beginUpdates和endUpdates 实现UITableView的动画块

UITableView beginUpdates/endUpdates 同时滚动使滚动跳转