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