繁体   English   中英

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

[英]How to set a custom view's intrinsic content size in Swift?

背景

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

我读过的

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

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

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

我在尝试什么

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

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

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

然后打电话

invalidateIntrinsicContentSize()

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

笔记

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

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

请注意,在...

堆栈视图的重要特例:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM