52

背景

我正在制作一个垂直标签以与传统的蒙古文字一起使用。在我只是旋转 a 之前,UILabel但存在一些性能问题和其他并发症。现在我正在从头开始制作标签。但是,我需要垂直标签在其高度调整时告诉自动布局(基于字符串长度)。

我读过的

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

搜索“自定义视图的 ios 内在内容大小”只会给我

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

我正在尝试什么

我正在尝试的是我在下面的答案。我正在添加这个问答对,这样其他人就不会像我使用我使用的搜索关键字那样花很长时间才能找到答案。

4

2 回答 2

94

设置自定义视图的内在内容大小可以让自动布局知道该视图想要多大。为了设置它,您需要覆盖intrinsicContentSize.

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

然后打电话

invalidateIntrinsicContentSize()

每当您的自定义视图的内在内容大小发生变化并且应该更新框架时。

笔记

于 2016-03-29T09:44:31.710 回答
15

“具有固有高度的视图”示例...

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

    override func prepareForInterfaceBuilder() {
         invalidateIntrinsicContentSize()
    }
}

在此处输入图像描述

您可以将其设置为可检查的

在此处输入图像描述

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

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

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

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

请注意,在...

堆栈视图的重要特例:

  • 您只设置了一个锚(对于垂直堆栈视图,高度;对于水平宽度)

因此,设置固有高度非常有效,因为:

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

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

于 2017-01-14T13:14:30.340 回答