自动调整单元格使UITableView跳动

12

我有一个UITableView,每个单元格都有一张图片和两个标签,如第一张图片所示。

enter image description here

所以我试图使用自适应大小的单元格,一切都很好,除了两件事:

1)第一个和第二个单元格不能正确显示内容,但是当我滚动然后返回它们时一切正常。我尝试在viewDidAppear中使用[tableview reloadData],但它没有帮助。请观察标签,首先它们不合适。您可以在此视频中观看:https://www.youtube.com/watch?v=I9DGBl1c5vg

请查看第一个单元格上的标签。

2)这是个棘手的问题。我正在滚动表格一切顺利,但问题发生在我选择行时。它将我推到详细视图,但当我按“返回”并返回主视图时,tableview会跳动,因此我回到的不是所选行,而且如果我滚动表格它也不会平稳地滚动,而是跳动。这是两个视频的链接,第一个视频展示了如果我不进入详细视图,滚动是平稳的:https://www.youtube.com/watch?v=9wAICcZwfO4,第二个视频展示了跳动问题:https://www.youtube.com/watch?v=fRcQ3Za1wDM

这绝对与自适应大小的单元格有关,因为如果我不使用它,这些问题都不会发生。


你在单元格中的标签和图像视图上使用了约束吗? - Teja Nandamuri
是的,图像有三个限制条件:1)前导空间 2)顶部空间 3)尾随空间; 第一个标签有三个限制条件:1)前导空间 2)顶部空间 3)尾随空间; 第二个标签有四个限制条件:1)前导空间 2)顶部空间 3)尾随空间 4)底部空间。 - igrrik
当您应用约束条件时,label1的边界是什么? - Teja Nandamuri
宽度为290,高度为21。 - igrrik
2个回答

7

好的,我已经解决了这两个问题。

问题1

我已添加了以下两行代码

[cell.contentView setNeedsLayout];
[cell.contentView layoutIfNeeded];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中,在return cell之前。

问题2

解决方案似乎非常简单。我只需要实现viewWillDissapear并在其中重新加载数据,所以代码看起来像这样:

- (void)viewWillDisappear:(BOOL)animated;{
    [super viewWillDisappear:animated];
    [self.tableView reloadData];
}

我的解决方案很简单,如果对某人无效,这里有一些有用的链接。
1)UITableView的布局在推动和返回时混乱。(iOS 8、Xcode beta 5、Swift)
2)http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html

4
很遗憾,我认为你提出的两个问题都是IOS的bug。
问题(1):
这篇博客提出了一个简单的解决方案。
引用博客中的一段话:
当首次显示表格时,你可能会发现某些单元格尺寸不正确。但是,当你滚动表格时,新的单元格将以正确的行高显示。为了解决这个问题,你可以在视图出现后强制重新加载:
只需在你的viewDidAppear方法中添加以下代码即可。我已经测试过,它非常有效。
[self.tableView reloadData];

问题(2)

这个第二个问题是一个重复的问题,下面是原问题链接:

IOS 8 UITableView自适应单元格在推入新视图控制器时会出现视觉上的跳动/移位

该问题的作者提供了一种解决方法,似乎还不错。但我还没有尝试过。

好的,我通过在sizeThatFits中缓存我的单元格高度来解决它,并在委托中返回该值作为估计单元格高度。效果很好。

欢迎前往该问题查看其他提议的解决方案。


谢谢您的回答。1)就像我之前所说,重新加载数据的修复方法对我无效。2)我不太明白他是如何做到的,而且他也没有使用约束条件,但我会问他。 - igrrik
我们取得了一些进展!第一个问题已经解决了。但第二个问题仍然存在。 实际上,这篇博客文章提供的只有两行代码: self.tableView.estimatedRowHeight = 239.0; self.tableView.rowHeight = UITableViewAutomaticDimension; 其他所有内容都是通过约束完成的。 我的项目与他们的区别在于,我在单元格中有一个imageview和detailview。 - igrrik
@igrrik,你是如何解决第一个问题的?你是通过重新加载表视图来解决它的吗? - Yuchen
好吧,事实证明第一个问题仍然存在。非常感谢您的帮助,我会学习所有这些主题并尝试解决这个问题。您回答中提供的主题看起来非常鼓舞人心,我已经向作者询问了更多信息。一旦我有任何结果,我会告诉您。 - igrrik
@igrrik 好的,请随时告诉我如果你找到了解决这个问题的方法。 - Yuchen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接