背景
我正在制作一个垂直标签,用于传统的蒙古文字。在我刚刚轮换UILabel
之前,但是有一些性能问题和其他复杂问题。现在我正在努力从头开始制作标签。但是,当高度调整时(基于字符串长度),我需要垂直标签来告诉自动布局。
我读过的内容
我阅读了Intrinsic Content Size和Views with Intrinsic Content Size文档。但这些更多是关于如何使用它,而不是如何在自定义视图中定义它。
为自定义视图搜索" ios内在内容大小"只给了我
Stack Overflow中的。这个特殊问题甚至不需要内在的内容大小,因为他们的视图只是标准视图的集合。
我正在尝试
我正在尝试的是下面的答案。我正在添加这个Q& A对,以便在我使用我使用的搜索关键字时,不会让其他人找到答案。
答案 0 :(得分:74)
设置自定义视图的内在内容大小可让自动布局知道该视图的大小。要进行设置,您需要覆盖intrinsicContentSize
。
override var intrinsicContentSize: CGSize {
return CGSize(width: x, height: y)
}
然后致电
invalidateIntrinsicContentSize()
每当您的自定义视图的内在内容大小发生更改并且帧应该更新时。
备注强>
invalidateIntrinsicContentSize()
的帮助。答案 1 :(得分:9)
基于上面的优秀答案,
具有固有高度"的视图示例...
@IBDesignable
class HView: UIView {
@IBInspectable var height: CGFloat = 100.0
override var intrinsicContentSize: CGSize {
return CGSize(width: 99, height: height)
// if using in, say, a vertical stack view, the width is ignored
}
}
您可以设置为可检查的
由于它具有固有高度,因此可以(例如)立即插入代码中的堆栈视图中:
stack?.insertArrangedSubview(HView(), at: 3)
相比之下,如果它是一个没有固有高度的普通视图,你必须添加一个高度锚点,否则它会崩溃:
let v:UIView = HView()
v.heightAnchor.constraint(equalToConstant: 100).isActive = true
stack?.insertArrangedSubview(v, at: 3)
请注意,在堆栈视图的特殊情况下:
因此,设置内在高度非常有效;因为
请记住,在子视图的所有正常情况下,都需要许多其他锚点。