【问题标题】:iOS11 UITableview reloadRowsAtIndexPaths glitchiOS11 UITableview reloadRowsAtIndexPaths 故障
【发布时间】:2017-10-11 03:34:14
【问题描述】:

谁能帮我理解或解决 iOS11 中的这个 UITableView 故障。我设法在一个相当简单的测试用例中重现了我的问题。

https://github.com/trapper-/iOS11-tableview-glitch

在表格视图底部附近重新加载单元格时,重新加载的单元格将开始奇怪地滚动,而其他单元格开始移动和跳跃。

重新加载多个单元格时会变得更糟,但我不想让这个简单的例子复杂化。

  • 编辑:此问题仅在 iOS11 中出现,在 iOS10 和 iOS12 中正常工作。所以 您需要下载 iOS11 模拟器才能在 Xcode 10 中进行测试

【问题讨论】:

  • 请编辑您的问题以包含演示问题的最少相关代码。
  • 最小相关代码链接到github上
  • 是的,我知道。但是您至少应该在问题中将表格视图代码的相关部分显示为实际文本。
  • 没有任何相关的代码可以展示,需要整个测试用例来证明问题。

标签: ios uitableview autolayout ios11


【解决方案1】:

这应该会有所帮助:

[UIView performWithoutAnimation:^{
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}];

【讨论】:

  • 不幸的是,我仍然在这里遇到故障 - 它确实发生得非常快,很难注意到。删除动画重新加载是相当妥协的。
【解决方案2】:

如果我这样使用,它的工作原理。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100;
}

【讨论】:

  • 有趣的是,这似乎有帮助,只要单元格不超过 100 高度,如果是这样,那么故障又回来了。更改为stringByPaddingToLength:100,您将看到问题再次出现。
  • 在iOS 11中,默认的表格行高是“自动的”,所以你需要实现estimatedHeightForRow或者heightForRow并且你必须返回一个合理的值或者你需要显式设置tableviews的行高属性来禁用自动行高
  • 所以我有完全动态的内容,可以是从 1 行到 20 行的任何内容,那么合理的值是多少?
  • 如果可能,您应该计算实际值。如果您还不知道,则返回一个默认值,一旦您知道单元格的实际高度(例如在 cellForRow 中),您可以将该高度存储在该行的数组中,并在下次估计高度和高度时返回该值方法被调用
【解决方案3】:

尝试将 estimatedRowHeight 设置为 0 到 viewDidLoad 上的表格视图。这个对我有用。

【讨论】:

  • 这只是禁用自动调整大小的表格单元格。所有的单元格变成一行。
  • 结合 Bess 的回答,如果您为表格视图单元格设置静态高度,这很有帮助。
【解决方案4】:

请尝试设置您的表格视图估计行高度(在 viewDidLoad 方法中): self.tableView.estimatedRowHeight = 100;

tableView.rowHeight 默认设置为 UITableViewAutomaticDimension 但你需要设置estimatedRowHeight 来自苹果 - “要启用自动调整表格视图单元格,您必须将表格视图的 rowHeight 属性设置为 UITableViewAutomaticDimension。您还必须为estimatedRowHeight 属性分配一个值。一旦设置了这两个属性,系统就会使用自动布局计算行的实际高度。”

您可以查看: https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithSelf-SizingTableViewCells.html

【讨论】:

  • 这只是禁用自动调整大小的表格单元格。所有的单元格变成一行。
  • @trapper 我添加了 self.tableView.estimatedRowHeight = 100;到您的项目 viewController 的 viewDidLoad ,它似乎解决了您的问题。默认情况下,您的 tableView.rowHeight 设置为 UITableViewAutomaticDimension,但您需要从 Apple 设置估计的RowHeight:“要启用自调整表格视图单元格,您必须将表格视图的 rowHeight 属性设置为 UITableViewAutomaticDimension。您还必须为估计的RowHeight 分配一个值属性。一旦设置了这两个属性,系统就会使用 Auto Layout 来计算行的实际高度。"
  • 在我发表评论后,您编辑了答案并完全改变了它。大声笑
  • @trapper yes :) 抱歉.. 但是这个新答案对你有用吗?
  • @trapper 做到了吗? ;)
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2019-01-17
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多