我有自定义UITableView
的{{1}}。每个单元格都有一堆UITableViewCell
,UIView
和UIStackView
子视图来构建我想要的设计。
使用AutoLayout定位UILabel
内的所有内容,并允许UITableView通过执行以下操作自动为单元格赋予高度:
UITableViewCell
然而,由于单元格的子视图布局的复杂性,向下滚动tableView是非常滞后/波动的,因为每个单元格都会尝试估计并构建它的正确高度。
我读了一些讨论这些问题的文章,如:
https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5
这激发了我尝试一种不同的方法,我将通过累加所有垂直空间计算每个单元格的高度,并通过利用如下函数计算动态字符串高度,然后将这些高度缓存在[[ IndexPath.row(Int),行高(CGFloat)]。
tableView.estimatedRowHeight = 85
tableView.rowHeight = UITableViewAutomaticDimension
虽然这确实有效,但现在我将帧计算extension String {
func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: CGFloat.max)
let boundingBox = self.boundingRectWithSize(constraintRect, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox.height
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if let height = cellHeightCache[indexPath.row] {
return height
} else {
let data = dataItems[indexPath.row]
var height: CGFloat = 0
height += 20 // top padding above text
height += data.title.heightWithConstrainedWidth(tableView.frame.width - 72 * 2, font: UIFont.boldSystemFontOfSize(18)) // height of title
height += 20 // bottom padding below text
... // this goes on and on with if statements depending on if the data has a subtitle, image, other properties, etc to get the correct height for *that* cell
cellHeightCache[indexPath.row] = ceil(height)
return height
}
}
与单元格子视图的AutoLayout混合以获得高度。并且因为这些是帧计算,如果用户旋转设备或在iPad上带来正确的分屏视图,这显然会中断。我可以尝试捕捉所有这些边缘情况,并在用户旋转/更改屏幕大小时重新计算,但我是否错过了在不使用框架的情况下计算这些单元格高度的方法?
无论如何只使用AutoLayout定位我可以计算tableView.frame.width - 72 * 2
函数中单元格的高度吗?
由于