具有AutoLayout的UITableView单元格 - 不平滑

时间:2016-03-12 23:55:44

标签: ios swift autolayout uitableview

我有自定义UITableView的{​​{1}}。每个单元格都有一堆UITableViewCellUIViewUIStackView子视图来构建我想要的设计。

使用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函数中单元格的高度吗?

由于

0 个答案:

没有答案