我有一个UICollectionViewCell
原型,应该是这样的:
在左侧,有UIImageView
我垂直居中并将其固定在UICollectionViewCell
的开头。
接下来是标题UILabel
,我将其固定在UICollectionViewCell
的顶部和末尾。我还把它固定在UIImageView
。
下面是一个详细信息UILabel
,我将其固定在标题的底部,UICollectionViewCell
的结尾,并将其限制为与标题具有相同的宽度。
下面是一个说明UILabel
,我将其固定在详细信息的底部,UICollectionViewCell
的末尾和UICollectionViewCell
的底部。它也与标题具有相同的宽度。
我想要实现的目标
标题和描述标签有0行(多行),因为我不知道标签在运行时会有多少行。
通过我的自定义UICollectionViewLayout
我提供了单元格的目标宽度。现在我需要弄清楚,给定宽度的单元格的高度。
我有一个不可见UICollectionViewCell
我认为我可以通过从我的数据源设置模型来计算尺寸。但我有一个问题。
问题
在我的“尺寸计算单元格”中设置标签文本后,我该如何处理宽度以及我还需要做什么呢?我可以让自动布局系统为单元格计算适当的高度然后我可以返回UICollectionViewLayout
或换句话说:我如何告诉单元格使用新宽度来计算其高度。
答案 0 :(得分:0)
将此扩展名添加到字符串:
extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox.height
}
}
然后这样做:
let heightOfLabel = self.string.height(withConstrainedWidth: labelWidth, font: UIFont(name: "HelveticaNeue", size: 15)!)
您将获得具有该字体和宽度的标签高度。之后,您可以总结标签高度并将其提供给单元格。
答案 1 :(得分:0)
好吧,我似乎误解了如何使用sizeThatFits。不过,我现在采用了不同的方法。这就是我为获取自我调整细胞所做的工作:
UIStackView
UIImageView
和UIStackView
置于水平UIStackView
UICollectionViewLayout
中使用协议来询问给定宽度的高度UICollectionViewController
中,我实现了协议,并在我注册我的单元格的地方,我还实例化了一个用于在协议函数中测量的单元格frame.size.height
设置为一个非常大的数字。然后我使用AutoLayout计算实际高度(setNeedsDisplay()
,layoutIfNeeded()
)我希望将来能帮到像我这样的人。 I also wrote a small blog post with some code samples of what I'm doing.