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.在故事板的表格视图中删除自定义单元格,
将任何子视图添加到自定义单元格:,
对单元格进行子类化并更改contentView.frame
中的layoutSubviews
,
构建并运行。
结果: 模拟器最终出现在黑色屏幕中,卡在无限布局子视图循环中。
预期成果:
模拟器显示表格视图,单元格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中的错误还是有人知道如何解决这个问题?
答案 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;
}