UITableView beginUpdates/endUpdates 同时滚动使滚动跳转
Posted
技术标签:
【中文标题】UITableView beginUpdates/endUpdates 同时滚动使滚动跳转【英文标题】:UITableView beginUpdates/endUpdates while scrolling makes scroll jump 【发布时间】:2019-03-14 13:40:47 【问题描述】:我的UITableView
需要显示来自服务器的一些图像。 UITableViewCell
由单个UIImageView
和NSLayoutConstraint
组成,高度为UIImageView
。
在视图控制器的cellForRowAtIndexPath
中,它从服务器获取图像并将图像调整为适合屏幕的宽度。一件重要的事情是图像需要保持纵横比,所以我编写了一个代码来获得保持纵横比的图像高度。高度应用于布局约束,即图像视图的高度。
除非我调用 [tableView beginUpdates]
和 [tableView endUpdates]
方法,否则单元格不会调整大小,因此我会在加载单元格的每个图像后调用这些方法。问题是当用户在获取图像时滚动表格视图并且正在调用beginUpdates
和endUpdates
方法时,滚动会跳转到某个点。 (我不确定表格视图跳转到哪里)
这是我试图防止跳跃的原因:
- (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" 是不是具有相同的行为?