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

时间:2015-11-08 17:57:20

标签: ios rotation autolayout orientation nslayoutconstraint

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

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

    self.myConstraint.constant = 30.0

  4. 或做:

    [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];
    

    提前致谢

3 个答案:

答案 0 :(得分:2)

使用viewWillTransitionToSize方法检测方向更改。当设备方向即将改变时,将调用此方法。

D

或者,如果要在方向更改后更改约束,请在viewWillTransitionToSize方法中使用协调器对象的animateAlongsideTransition方法。

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{
      //change constraints
}

答案 1 :(得分:0)

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

[self.view layoutIfNeeded];
self.myConstraint.constant = 30.0;
[self.view layoutIfNeeded];

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

答案 2 :(得分:0)

最好的想法是在Interface Builder中使用Size Classes来实现自转变化。

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes

相关问题