如何在Swift中设置自定义视图的内在内容大小?

时间:2016-03-29 09:44:32

标签: ios swift custom-controls intrinsic-content-size

背景

我正在制作一个垂直标签,用于传统的蒙古文字。在我刚刚轮换UILabel之前,但是有一些性能问题和其他复杂问题。现在我正在努力从头开始制作标签。但是,当高度调整时(基于字符串长度),我需要垂直标签来告诉自动布局。

我读过的内容

我阅读了Intrinsic Content SizeViews with Intrinsic Content Size文档。但这些更多是关于如何使用它,而不是如何在自定义视图中定义它。

为自定义视图搜索" ios内在内容大小"只给了我

Stack Overflow中的

。这个特殊问题甚至不需要内在的内容大小,因为他们的视图只是标准视图的集合。

我正在尝试

我正在尝试的是下面的答案。我正在添加这个Q& A对,以便在我使用我使用的搜索关键字时,不会让其他人找到答案。

2 个答案:

答案 0 :(得分:74)

设置自定义视图的内在内容大小可让自动布局知道该视图的大小。要进行设置,您需要覆盖intrinsicContentSize

override var intrinsicContentSize: CGSize {
   return CGSize(width: x, height: y)
}

然后致电

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
    }
}

enter image description here

您可以设置为可检查的

enter image description here

由于它具有固有高度,因此可以(例如)立即插入代码中的堆栈视图中:

stack?.insertArrangedSubview(HView(), at: 3)

相比之下,如果它是一个没有固有高度的普通视图,你必须添加一个高度锚点,否则它会崩溃:

let v:UIView = HView()
v.heightAnchor.constraint(equalToConstant: 100).isActive = true
stack?.insertArrangedSubview(v, at: 3)

请注意,在堆栈视图的特殊情况下:

  • 你只需担心一个锚(垂直堆栈视图,高度;水平宽度)

因此,设置内在高度非常有效;因为

  • 固有高度确实意味着如果需要,将自动设置高度锚点。

请记住,在子视图的所有正常情况下,都需要许多其他锚点。