“setNeedsUpdateConstraints”和“layoutIfNeeded”有什么区别?什么时候会被召唤?

时间:2015-11-09 11:03:53

标签: ios rotation autolayout orientation nslayoutconstraint

autolayout约束的值不同,具体取决于设备方向。我用这种方式更新约束:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
   [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

   UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

   if ((orientation == UIInterfaceOrientationPortrait) || (orientation == UIInterfaceOrientationPortraitUpsideDown)) {
    self.backgroundView.image = [UIImage imageNamed:@"landscape.jpg"];
    [self updateLandscapeConstraints];
   }
   else if ((orientation == UIInterfaceOrientationLandscapeLeft) ||
            (orientation == UIInterfaceOrientationLandscapeRight)) {
    self.backgroundView.image = [UIImage imageNamed:@"portrait.jpg"];
    [self updatePortraitConstraints];
   }
}

在某些帖子中,我看到在应用约束更新后调用[self.view setNeedsUpdateConstraints],而在其他帖子中调用[self.view layoutIfNeeded]。有什么区别?

提前致谢

编辑:我以这种方式更新约束,是否正确?:

- (void)updateLandscapeConstraints
{
   [self.view layoutIfNeeded];

   self.passwordViewHeight.constant = 34.0;
   self.usernameViewHeight.constant = 34.0;

   [self.view removeConstraint:self.registrationButtonEqualWidth];

   self.registrationButtonEqualWidth = [NSLayoutConstraint constraintWithItem:self.registrationButton
                                                                    attribute:NSLayoutAttributeWidth
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:self.backgroundView
                                                                    attribute:NSLayoutAttributeWidth
                                                                   multiplier:0.6
                                                                     constant:0.0];

   [self.view addConstraint:self.registrationButtonEqualWidth];

   [self.view layoutIfNeeded];
}

1 个答案:

答案 0 :(得分:0)

如果您更改了一些会改变约束的条件(如偏移或框架),请调用setNeedsUpdateConstraints。

  

系统将调用updateConstraints作为其正常布局传递的一部分。在需要之前立即更新约束可确保在布局过程之间对视图进行多次更改时,不会不必要地重新计算约束。

如果您在更新约束后需要执行任何操作以立即生效,请在其后使用layoutIfNeeded。

所以你需要先调用setNeedsUpdateConstraints,一旦完成,你需要调用layoutIfNeeded,因为它在绘制之前强制子视图的布局,以便更改的约束在视图中相应地反映。