设备旋转时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; } }