设备旋转时iOS更改自动布局约束

我想在设备旋转时修改布局约束。 我的UIViewController由2个UIViews组成,横向排列,纵向排列。

它确实工作,在willAnimateRotationToInterfaceOrientation ,我删除了所需的约束,并取而代之与他人有正确的布局…

但是有一些问题,在旋转过程中自动布局在willAnimateRotationToInterfaceOrientation被调用之前开始破坏约束,那么当设备重新定位发生的时候,我们的意思是在什么地方replace我们的约束呢?

另一个问题是性能,经过几轮的系统不会再破坏约束,但我有一个巨大的性能下降,尤其是在肖像模式… … –

willRotateToInterfaceOrientation:duration: ,将setNeedsUpdateConstraints发送到任何需要修改其约束的视图。

或者,制作一个UIView子类。 在你的子类中,注册接收UIApplicationWillChangeStatusBarOrientationNotification 。 当你收到通知时,发送你自己的setNeedsUpdateConstraints

这在视图上设置needsUpdateConstraints标志。 在系统执行布局(通过发送layoutSubviews消息)之前,它发送一个updateConstraints消息给设置了needsUpdateConstraints标志的任何视图。 这是你应该修改约束的地方。 制作一个UIView子类并覆盖updateConstraints来更新你的约束。

在Matthijs Hollemans的post里有很好的自动布局和旋转的解释。 你可以在这里find它: http : //www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

通常,您需要约4个约束才能正确定位视图。 如果我的意见有恒定的大小,我宁愿钉高度和宽度。 之后,您可以使用Leading和Top space约束来做任何你想做的事情。 例如,您可以为您的视图设置IBOutlet,以获取前导空间和顶部空间约束:

 @interface ViewController : UIViewController { IBOutlet NSLayoutConstraint *_leadingSpaceConstraint; IBOutlet NSLayoutConstraint *_topSpaceConstraint; } 

然后从出口控制 – 拖动到您的约束。 现在你可以直接从代码中改变你的视图约束:

 _leadingSpaceConstraint.constant = NEW_CONSTRAINT_VALUE; 

要提交更改,您需要致电:

 [self.view layoutIfNeeded]; 

如果你想做animation:

 [UIView animateWithDuration:0.25 animations:^{ [self.view layoutIfNeeded]; }]; 

我认为它会在willAnimateRotationToInterfaceOrientation中工作,因为你不需要用这种方法来打破任何约束。

一些例子:你有两个方向正方形的视图,一个在另一个之下。 例如,将他们的“领先空间超级查看”约束设置为20。 然后将“top space to superview constraint”设置为第一个视图为20,第二个为120。 这将是我们的默认设置。

然后,旋转后,你需要重新计算你的约束。 现在把上限约束设定为20,将约束约束分别设定为20和120。 然后使用layoutIfNeeded提交更改。

我希望这会有所帮助。

重写-(void) viewWillLayoutSubviews在你的UIViewController更新你的约束如下代码:

 -(void) viewWillLayoutSubviews { switch(self.interfaceorientation) { case UIInterfaceOrientationLandscapeLeft: break; case UIInterfaceOrientationLandscapeRight: break; case UIDeviceOrientationPortrait: break; case UIDeviceOrientationPortraitUpsideDown: break; } }