[英]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.