UICollectionViewCell的高度,具有2个多行UILabel /自我调整大小集合视图单元格

时间:2017-04-29 00:08:39

标签: ios swift uicollectionview autolayout

我有一个UICollectionViewCell原型,应该是这样的:

enter image description here

在左侧,有UIImageView我垂直居中并将其固定在UICollectionViewCell的开头。

接下来是标题UILabel,我将其固定在UICollectionViewCell的顶部和末尾。我还把它固定在UIImageView

的末尾

下面是一个详细信息UILabel,我将其固定在标题的底部,UICollectionViewCell的结尾,并将其限制为与标题具有相同的宽度。

下面是一个说明UILabel,我将其固定在详细信息的底部,UICollectionViewCell的末尾和UICollectionViewCell的底部。它也与标题具有相同的宽度。

我想要实现的目标

标题和描述标签有0行(多行),因为我不知道标签在运行时会有多少行。

通过我的自定义UICollectionViewLayout我提供了单元格的目标宽度。现在我需要弄清楚,给定宽度的单元格的高度。

我有一个不可见UICollectionViewCell我认为我可以通过从我的数据源设置模型来计算尺寸。但我有一个问题。

问题

在我的“尺寸计算单元格”中设置标签文本后,我该如何处理宽度以及我还需要做什么呢?我可以让自动布局系统为单元格计算适当的高度然后我可以返回UICollectionViewLayout

或换句话说:我如何告诉单元格使用新宽度来计算其高度。

2 个答案:

答案 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
  • 我将UIImageViewUIStackView置于水平UIStackView
  • 我将父级堆栈视图固定到单元格的左侧,右侧,顶部和底部,其中底部约束为> = 0而不是仅仅= 0
  • 我在UICollectionViewLayout中使用协议来询问给定宽度的高度
  • 在我的UICollectionViewController中,我实现了协议,并在我注册我的单元格的地方,我还实例化了一个用于在协议函数中测量的单元格
  • 在协议中,我首先获取模型对象,然后将模型传递到我的测量单元格中,我将其保存在视图控制器中的实例变量中
  • 然后我在我的手机上调用getHeight(forWidth)。在此函数中,我将单元格frame.size.height设置为一个非常大的数字。然后我使用AutoLayout计算实际高度(setNeedsDisplay()layoutIfNeeded()
  • 我需要的高度是父堆栈视图的高度加上边距

我希望将来能帮到像我这样的人。 I also wrote a small blog post with some code samples of what I'm doing.