Self Sizing Cells 使 UITableView 跳跃
Posted
技术标签:
【中文标题】Self Sizing Cells 使 UITableView 跳跃【英文标题】:Self Sizing Cells make UITableView jump 【发布时间】:2015-02-23 13:35:36 【问题描述】:我有一个 UITableView,每个单元格都有一个图像和两个标签,如第一张图片所示
所以我正在尝试使用自动调整大小的单元格,一切都很好,除了两件事:
1) 第一个和第二个单元格没有正确显示内容,但是在我向下滚动然后返回它们之后一切正常。我尝试在 viewDidAppear 中使用 [tableview reloadData],但没有帮助。起初看标签,它们不适合。你可以看这个视频https://www.youtube.com/watch?v=I9DGBl1c5vg
查看第一个单元格上的标签。
2) 这是一个艰难的过程。我正在滚动表格,一切都很好,但是当我选择行时,问题就发生了。它把我推到详细视图,但是当我按“返回”并返回主视图时,表格视图会跳转,所以我不会回到选定的行,如果我滚动表格,它也不会平滑滚动,但是跳跃。这是两个视频的链接,第一个显示滚动流畅https://www.youtube.com/watch?v=9wAICcZwfO4如果我不去详细视图,第二个显示跳跃问题https://www.youtube.com/watch?v=fRcQ3Za1wDM。
绝对确定与自定尺寸单元有关,因为如果我不使用它,则不会发生此问题。
【问题讨论】:
您是否对单元格中的标签和图像视图使用了约束? 是的,图像有 3 个约束:1)前导空格 2)顶部空格 3)尾随空格;第一个标签的 3 个约束:1)前导空格 2)顶部空格 3)尾随空格;第二个标签的 4 个约束 1)前导空间 2)顶部空间 3)尾随空间 4)底部空间 应用约束时 label1 的边界是什么? 宽290,高21 【参考方案1】:好的,我解决了这两个问题。
问题 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 layout messing up on push segue and return. (ios 8, Xcode beta 5, Swift) 2)http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html
【讨论】:
【参考方案2】:很遗憾,我认为您提出的两个问题都是 IOS 错误。
问题(一)
blog 建议了一个简单的修复方法。
第一次显示表格视图时,您可能会发现某些单元格的大小不合适。但是当您滚动表格视图时,新单元格将以正确的行高显示。要解决此问题,您可以在视图出现后强制重新加载:
只需将以下内容添加到您的 viewDidAppear
方法中。我已经对其进行了测试,并且效果很好。
[self.tableView reloadData];
问题(2)
第二个问题与以下问题重复:
IOS 8 UITableView self-sizing cells jump/shift visually when a new view controller is pushed
问题的作者自己提出了一种解决方法,这似乎没问题。但是,我还没有尝试过这个。
好的,我通过在 sizeThatFits 中缓存我的单元格高度并返回代表内估计的单元格高度的值来解决它。效果很好。
请随意前往该问题以获取其他建议的解决方案。
【讨论】:
谢谢您的回答。 1)正如我之前所说,重新加载数据的修复对我不起作用 2)我不明白他到底是怎么做到的,而且他也没有使用约束,但我会问他 @igrrik,也许你可以从这个link 下载项目并与你的比较,看看有什么不同?此示例代码由 blog 提供,[self.tableView reloadData]
确实在那里工作。或者,如果您愿意,您可以发布一些相关代码,让我们看看它们?也可能是因为其他原因。
我们取得了一些进展!第一个问题已经解决了。但第二个还在。好吧,实际上只有两行代码,由这篇博文提供:self.tableView.estimatedRowHeight = 239.0; self.tableView.rowHeight = UITableViewAutomaticDimension;其他一切都是有约束的。我的项目和他们的区别在于,我的单元格中有一个 imageview 和一个 detailview。
@igrrik,你是怎么解决第一个问题的?你通过重新加载表格视图解决了吗?
@igrrik,似乎很多人实际上都遇到了这个 IOS 错误。也看看这个:***.com/a/25800080/1035008。在这一点上,我建议等待Apple修复他们的错误。如果此跳转对您来说是一个关键问题,我还建议使用一些传统方法来制作可调整大小的单元格,正如本文***.com/questions/18746929/… 中所讨论的那样以上是关于Self Sizing Cells 使 UITableView 跳跃的主要内容,如果未能解决你的问题,请参考以下文章
iOS:通过Self-Sizing Cells新特性自动计算cell的高度
[React] Create a Virtualized List with Auto Sizing Cells using react-virtualized and CellMeasurer(代码
Self Sizing CollectionView 在 Self Sizing TableViewCell 内
iOS 8 上的 UICollectionView self-sizing-cell 将与 UIDynamic flowLayout 和重复调用 _updateVisibleCellsNow 一起崩溃