iOS8 Beta 3 UITableViewCell layoutSubviews无限循环

时间:2014-07-08 08:44:53

标签: ios uitableview loops layoutsubviews

iOS8中引入了可自动调整大小的表格视图单元格(WWDC Session 226表和集合视图中的新功能)。 在我的项目中,我正在尝试实现旧的固定行高度行为。另外,对我来说最重要的是在左侧和右侧插入带边距的默认cell.contentView框架。 因此,我更改cell.contentView.frame属性,然后立即调用-[cell setNeedsLayout]方法,并导致单元格陷入无限layoutSubviews循环。

重现的步骤:

  1. 创建新的单一视图项目并使用表视图控制器替换默认视图控制器

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

  3. -(void)viewDidLoad { [super viewDidLoad]; self.tableView.estimatedRowHeight = 0; self.tableView.rowHeight = 44; }  3.在故事板的表格视图中删除自定义单元格,

    1. 将任何子视图添加到自定义单元格:enter image description here

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

    3. 构建并运行。

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

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

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

      • self.tableView.estimatedRowHeight = 0; self.tableView.rowHeight = 44;
      • cell.contentView.frame = CGRectMake(...)
      • cell have custom subviews dropped on it in xib or storyboard

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

在ViewDidLoad中,请使用以下行,不需要给出行高

-(void)viewDidLoad {
        [super viewDidLoad];
        self.tableView.estimatedRowHeight = 44.0f;
        self.tableView.rowHeight = UITableViewAutomaticDimension;
}