设备方向更改时以编程方式更新约束的正确方法?

App*_*Dev 8 rotation orientation ios autolayout nslayoutconstraint

我正在使用storyboardautolayout,并IBOutlet在相应的视图控制器中设置IB 中的约束.我正在阅读几篇关于如何更新纵向和横向不同的约束的帖子,但我仍然不确定应该怎么做:

  1. 我应该在-viewWillTransitionToSize:withTransitionCoordinator:方法或updateViewConstraints方法中设置新约束吗?
  2. 设置新约束时,我应该打电话[self.view setNeedsUpdateConstraints];,或者layoutIfNeeded,或者setNeedsLayout
  3. 我应该如何更新,例如,某个约束的常量:

    self.myConstraint.constant = 30.0

或做:

[self.view removeConstraint:self.passwordViewHeight];

self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView
                                                      attribute:NSLayoutAttributeHeight
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:nil
                                                      attribute:NSLayoutAttributeNotAnAttribute
                                                     multiplier:1.0
                                                       constant:34.0];

[self.view addConstraint:self.passwordViewHeight];
Run Code Online (Sandbox Code Playgroud)

提前致谢

小智 1

最好的方法是更改​​常量,而不是删除约束并再次重新创建它。从长远来看,仅对常数进行加或减也会快得多。你想做的是这样的:

[self.view layoutIfNeeded];
self.myConstraint.constant = 30.0;
[self.view layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)

建议您在更改常量之前和之后调用layoutIfNeeded。这是因为您可能有一些约束尚未完成,并且会在更改更多约束之前执行。