[英]Where are constraints updated for size classes?
我在接口構建器中使用默認值和緊湊寬度值來約束。 我將此約束鏈接到IBOutlet,因此我可以在運行時獲取代碼中的常量值。 如果我在iPhone 4S模擬器上運行,則在viewDidLoad
,常量為默認值。 都不會調用willTransitionToTraitCollection
或viewWillTransitionToSize
,但是在某些時候約束會更新為緊湊值,因為稍后它是正確的。 UIViewController
在哪里更新約束? 不是updateViewConstraints
。
更新:建議的viewDidLayoutSubviews
和traitCollectionDidChange
方法也不是在其中更改常量的位置:
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.