我有UITableView
和UITableViewAutomaticDimension
一些estimatedRowHeight
。对于这个表,我使用了 custom UITableViewCell
,其中包含一些 label 和 customUIView
并覆盖了intrinsicContentSize()
。约束设置正确,表格能够确定每行的实际高度。到目前为止,一切都很好。
现在我开始修改我的自定义视图的内部逻辑,以根据可用宽度调整它的外观,即当表格单元格大小不够宽时,我的视图可以重新排列子视图以适应新的限制,这会对结果高度产生影响,所以我有类似的代码那:
var internalSize: CGSize = ...
override func intrinsicContentSize() -> CGSize {
return internalSize
}
override func layoutSubviews() {
super.layoutSubviews()
fitIntoWidth(frame.size.width)
}
private func fitIntoWidth(width: CGFloat) {
let height = // calculate based on content and width
internalSize = CGSizeMake(width, height)
invalidateIntrinsicContentSize()
}
现在,当我填充表格视图时,intrinsicContentSize()
返回一些所需的值,但它不适合当前布局,然后控制转到layoutSubviews()
重新计算大小并再次调用系统的位置intrinsicContentSize()
,现在它返回了良好的值。但是,第一个时间表会加载基于错误intrinsicContentSize()
值计算的数据和像元高度。如果我reloadData()
再次调用一切都会变得很好,并且表格中所有即将出现的单元格的布局也可以。
我的错误在哪里以及如何修改代码以使单元格大小正常工作而无需调用reloadData()
两次?