我的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%。该代码有时甚至阻止减速并保持跳跃。
是否存在防止滚动视图跳动的内容?还是计算细胞的更好方法?
答案 0 :(得分:0)
无法在cellForRow中获取数据。这很耗时,您正在阻塞主线程。
所有与服务器相关的项目都必须在另一个线程上完成,完成后,您将重新加载tableView(或其中的特定项目)。
如果您知道图像的大小,则可以使用imageView中图像的大小来创建单元格,然后在从服务器获取该行的数据之后,只需使用[tableView reloadAtIndexPaths:]刷新该单元格即可。
要保持宽高比,只需将imageView的contentMode设置为.aspectFit。
要完全回答您的问题,您需要重新考虑该过程。将与服务器相关的所有内容移到另一个线程上。如果有可用物品,请重新加载单元格。尝试创建具有固定大小的单元格,并在有数据时刷新它。将imageView contentMode设置为AspectFit。