gpt4 book ai didi

iOS8 Beta 3 UITableViewCell layoutSubviews 死循环

转载 作者:可可西里 更新时间:2023-11-01 05:53:53 72 4
gpt4 key购买 nike

iOS8 中引入了可自动调整大小的表格 View 单元格(WWDC Session 226 What's new in table and collection views)。在我的项目中,我正在尝试实现旧的固定行高行为。此外,对我来说最重要的是插入默认的 cell.contentView 框架,并在左侧和右侧设置边距。因此,我更改了 cell.contentView.frame 属性,之后立即调用了 -[cell setNeedsLayout] 方法,这导致单元格陷入无限layoutSubviews 循环。

重现步骤:

  1. 创建新的单 View 项目并将默认 View Controller 替换为 TableView Controller

  2. 禁用表格 View 自动高度计算

-(void)viewDidLoad {
[ super viewDidLoad];
self.tableView.estimatedRowHeight = 0;
self.tableView.rowHeight = 44;
}
3. 在 Storyboard的 TableView 中放置一个自定义单元格,

  1. 将任何 subview 添加到自定义单元格:enter image description here ,

  2. 将单元格子类化并更改 layoutSubviews 中的 contentView.frame

  3. 构建并运行。

结果:模拟器最终陷入无限布局 subview 循环中的黑屏。

预期结果:模拟器显示表格 View ,其中单元格的 contentView 具有自定义框架。

评论:在稍微调试时,我发现如果单元格上没有任何自定义 subview ,则可以避免无限循环。所以看来这个bug是在满足以下条件后才会出现的:

  • self.tableView.estimatedRowHeight = 0; self.tableView.rowHeight = 44;
  • cell.contentView.frame = CGRectMake(...)
  • 单元格在 xib 或 storyboard 中放置了自定义 subview

Apple 在 iOS8 的“已知问题”列表中没有这个问题,所以我想知道它实际上是 iOS8 中的一个错误还是有人知道如何解决这个问题?

最佳答案

这不是错误:setNeedsLayout 将在您更改 View 的框架时调用。

我的猜测是,更改 cell.contentView.frame 也会更改 iOS 8 中的 cell.bounds,从而触发重新布局。此行为可能因 iOS 版本而异;无论如何,这些都是标准 View ,所以我们不应该以不受支持的方式更改它们。

与其在 cell.contentView 上操作,不如向其添加带有 insets 的自定义 View 如何?或者只是创建一个高度限制?

关于iOS8 Beta 3 UITableViewCell layoutSubviews 死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627396/

72 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com