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

时间:2019-03-14 13:40:47

标签: ios objective-c uitableview

我的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 个答案:

答案 0 :(得分:0)

无法在cellForRow中获取数据。这很耗时,您正在阻塞主线程。

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

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

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

要完全回答您的问题,您需要重新考虑该过程。将与服务器相关的所有内容移到另一个线程上。如果有可用物品,请重新加载单元格。尝试创建具有固定大小的单元格,并在有数据时刷新它。将imageView contentMode设置为AspectFit。