簡體   English   中英

尺寸類的約束在哪里更新?

[英]Where are constraints updated for size classes?

我在接口構建器中使用默認值和緊湊寬度值來約束。 我將此約束鏈接到IBOutlet,因此我可以在運行時獲取代碼中的常量值。 如果我在iPhone 4S模擬器上運行,則在viewDidLoad ,常量為默認值。 都不會調用willTransitionToTraitCollectionviewWillTransitionToSize ,但是在某些時候約束會更新為緊湊值,因為稍后它是正確的。 UIViewController在哪里更新約束? 不是updateViewConstraints

更新:建議的viewDidLayoutSubviewstraitCollectionDidChange方法也不是在其中更改常量的位置:

override func viewDidLayoutSubviews() {
    println("Before viewDidLayoutSubviews: \(self.navControllerBottomSpaceConstraint.constant)")
    super.viewDidLayoutSubviews()
    println("After viewDidLayoutSubviews: \(self.navControllerBottomSpaceConstraint.constant)")
}

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    println("Before traitCollectionDidChange: \(self.navControllerBottomSpaceConstraint.constant)")
    super.traitCollectionDidChange(previousTraitCollection)
    println("After traitCollectionDidChange: \(self.navControllerBottomSpaceConstraint.constant)")
}

輸出:

Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before viewDidLayoutSubviews: 20.0
After viewDidLayoutSubviews: 20.0
Before traitCollectionDidChange: 20.0
After traitCollectionDidChange: 20.0
Before viewDidLayoutSubviews: 0.0
After viewDidLayoutSubviews: 0.0
Before viewDidLayoutSubviews: 0.0
After viewDidLayoutSubviews: 0.0

感謝Matt和Sega-Zero為我指出正確的方向。

答案是約束已進入視圖層次結構后,在視圖的第一個layoutSubviews更新了約束。 因此,您可以在視圖控制器中執行以下操作:

override func viewDidLayoutSubviews() {
    if self.propertyCalculatedFromConstraints == nil && self.view.window != nil {
        // constraints and sizes are now valid
        self.propertyCalculatedFromConstraints = self.constraint.constant
    }
    super.viewDidLayoutSubviews()
}

override func viewDidDisappear() {
    self.propertyCalculatedFromConstraints = nil
    super.viewDidDisappear()
}

traitCollectionDidChange:是您可以捕獲尺寸類更改的地方,父視圖的viewDidLayoutSubviews是可以檢測到任何自動布局更改的地方

暫無
暫無

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

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