iOS8 Beta 3 UITableViewCell layoutSubviews无限循环

iOS8中引入了可自动调整大小的表格视图单元格(WWDC Session 226表和集合视图中的新功能).

在我的项目中,我正在尝试实现旧的固定行高度行为.另外,对我来说最重要的是在左侧和右侧插入默认的cell.contentView框架边框.

因此,我更改了cell.contentView.frame属性,之后立即调用 – [cell setNeedsLayout]方法,并导致单元格卡在无限的layoutSubviews循环中.

重现步骤:

>创建新的单一视图项目,并使用表视图控制器替换默认视图控制器
>禁用表格视图自动高度计算

– (void)viewDidLoad {
        [super viewDidLoad];
        self.tableView.estimatedRowHeight = 0;
        self.tableView.rowHeight = 44;
}

 3.在故事板中的表视图中删除自定义单元格,

>将任何子视图添加到自定义单元格:,
>对单元格进行子类化并更改layoutSubviews中的contentView.frame,
>构建并运行.

结果:
模拟器最终在黑色屏幕中卡在无限布局子视图循环中.

预期结果:
模拟器显示具有单元格contentView的表视图,具有自定义框架.

评论:
在调试一点时,我发现如果单元格上没有任何自定义子视图,则可以避免无限循环.因此,在满足以下条件后,似乎会出现错误:

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

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

最佳答案 这不是错误:只要您更改视图的框架,就会调用setNeedsLayout.

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

而不是在cell.contentView上运行,如何添加带有insets的自定义视图呢?或者只是创建一个高度约束?

点赞