簡體   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