繁体   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