UITableView beginUpdates / endUpdates在滚动时进行滚动跳转

问题描述 投票:0回答:1

我的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%。这段代码有时甚至可以阻止减速并保持跳跃。

反正是否有阻止滚动视图的跳跃?或者更好的方法来计算细胞?

ios objective-c uitableview
1个回答
0
投票

在cellForRow中获取数据是不行的。这是耗时的,你正在阻止主线程。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.