簡體   English   中英

如何使自動布局與XIB上的自定義UIView一起使用?

[英]How to make autolayout work with custom UIView on XIB?

我在XIB上有一個UIView ,其中包含一個UIImageView和一個UILabel ,兩者之間有一個很小的空間。 水平布局是簡單鏈接的|--image--label--| 其中--是一些固定的空間。 高度固定為40,此視圖在其視圖控制器中水平居中,並且寬度限制>= 100。

如果更改標簽文本,則組合視圖的寬度將按照其標簽更改后的寬度的預期寬度進行更新,並且它將很好地保持在視圖控制器的中心。

因為我需要在其他地方包含圖像和標簽的UIView ,所以我創建了一個包含XIB和Swift文件的自定義類。 我們稱之為ItemView

我遇到的問題是視圖控制器XIB上的空UIView (我已將類更改為ItemView )不再接受>= 40寬度約束。 當然,這是因為該視圖控制器XIB不再看到可變寬度UILabel ,而是只是一個普通UIView類的ItemView 我收到“不平等約束歧義” IB錯誤。

結果是我的自定義視圖的寬度保持為40。如果我指定更大的> =標簽寬度,它會起作用。 然后,僅在達到此寬度時才截取文本。 但是在第二種情況下,我的自定義視圖不再水平居中,而是向左移動了一點。

我該如何解決? 或者,如何告訴IB以與UILabel類似的方式對待我的自定義ItemView

在我的ItemView我已經找到了所有可以找到的東西:

override class var requiresConstraintBasedLayout: Bool
{
    return true
}

設置標簽文本后,調用setNeedsLayout()

調用myLabel.translatesAutoresizingMaskIntoConstraints = false

調用self.translatesAutoresizingMaskIntoConstraints = false

並在兩個init()中都調用self.setNeedsUpdateConstraints()

在視圖的“大小”檢查器中配置此彈出窗口:

在此處輸入圖片說明

現在,IB不必擔心您的尺寸規格。 您比IB更了解,這就是如何告訴IB事實。


另一種方法:在視圖的“大小”檢查器中配置彈出窗口:

在此處輸入圖片說明

這告訴IB,視圖將具有它不知道的固有內容大小。


這些都可以。 如您在此屏幕快照中所看到的,我給自定義視圖的寬度限制大於或等於40,但是IB沒有抱怨任何錯誤:

在此處輸入圖片說明

我如何構造自定義UIView :XIB的文件所有者是ItemView ItemView有一個@IBOutlet var: UIView! 連接到XIB中的視圖。 然后我有:

init()
{
    super.init(frame: .zero)

    self.initView()
}

required init?(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)

    self.initView()
}

private func initView()
{
    Bundle.main.loadNibNamed("ItemView", owner: self, options: nil)
    self.view.frame = CGRect(x: 0.0, y: 0.0, width: self.width, height: self.height)
    self.addSubview(self.view!)
}

(我似乎在使用XIB創建自定義UIView時需要額外的UIView 。很想知道是否不需要它。)

為了使其正常工作,我需要在更新標簽后調用self.invalidateIntrinsicContentSize() 並覆蓋intrinsicContentSize

override open var intrinsicContentSize: CGSize
{
    return self.view.systemLayoutSizeFitting(self.bounds.size)
}

請注意,我是在self.view而不是self上調用它。

感謝@matt為我指出正確的方向。 這是我第一次遇到這樣的事情。

我嘗試了以下所有步驟,我們都沒有必要:

override class var requiresConstraintBasedLayout: Bool
{
    return true
}

設置標簽文本后,調用setNeedsLayout()

調用myLabel.translatesAutoresizingMaskIntoConstraints = false

調用self.translatesAutoresizingMaskIntoConstraints = false

並在兩個init()中都調用self.setNeedsUpdateConstraints()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM