4

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

重现步骤:

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

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

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

  1. 将任何子视图添加到自定义单元格:在此处输入图像描述

  2. 子类化单元格并更改contentView.frame,layoutSubviews

  3. 构建并运行。

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

预期结果:模拟器显示一个contentView带有自定义框架的单元格的表格视图。

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

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

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

4

2 回答 2

2

这不是一个错误:setNeedsLayout任何时候你改变视图的框架都会被调用。

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

与其在 上操作,不如cell.contentView添加一个带有插图的自定义视图?或者只是创建一个高度约束?

于 2014-07-08T12:33:44.663 回答
0

在 ViewDidLoad 请使用下面的行,不需要给出行高

-(void)viewDidLoad {
        [super viewDidLoad];
        self.tableView.estimatedRowHeight = 44.0f;
        self.tableView.rowHeight = UITableViewAutomaticDimension;
}
于 2014-10-10T11:34:23.257 回答