更改方向的自动布局约束
Changing Auto Layout constraints for orientation
我有一个应用程序,根据它是纵向还是横向(具体来说,是否高度 > 宽度),布局会有所不同。在旋转时,在 viewWillTransitionToSize:withTransitionCoordinator:
中,我适当地更新了一些自动布局约束的常量。问题是此时视图的框架实际上还没有旋转,所以我经常在调试器中收到一条愤怒的消息,说我的约束无法满足。
我的问题是:我在旋转序列的哪个点修改约束,以便视图的框架已经改变,但我仍然在旋转的同时获得动画?
This question 建议在 willAnimateRotationToInterfaceOrientation
中调用 [self.view setNeedsUpdateConstraints]
,但该方法现已弃用。我尝试在 viewWillTransitionToSize
中调用该方法,但仍然收到愤怒的消息。
我好像已经解决了。参见 this article and PureLayout。基本上:
- 实现类似
-(void)updateConstraintsForSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator;
的方法
- 在这种方法中,如果您已经旋转(将状态存储在某处),请卸载所有约束并生成新约束。如果您有协调器,请在协调器的
animateAlongsideTransition
块参数中安装它们和 [self.view layoutIfNeeded]
。否则只需安装和布局。
- 覆盖
viewDidLayoutSubviews
并使用 self.view.bounds.size
和 nil
调用此方法
- 覆盖
viewWillTransitionToSize:withTransitionCoordinator:
并适当地调用您的方法
我有一个应用程序,根据它是纵向还是横向(具体来说,是否高度 > 宽度),布局会有所不同。在旋转时,在 viewWillTransitionToSize:withTransitionCoordinator:
中,我适当地更新了一些自动布局约束的常量。问题是此时视图的框架实际上还没有旋转,所以我经常在调试器中收到一条愤怒的消息,说我的约束无法满足。
我的问题是:我在旋转序列的哪个点修改约束,以便视图的框架已经改变,但我仍然在旋转的同时获得动画?
This question 建议在 willAnimateRotationToInterfaceOrientation
中调用 [self.view setNeedsUpdateConstraints]
,但该方法现已弃用。我尝试在 viewWillTransitionToSize
中调用该方法,但仍然收到愤怒的消息。
我好像已经解决了。参见 this article and PureLayout。基本上:
- 实现类似
-(void)updateConstraintsForSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator;
的方法
- 在这种方法中,如果您已经旋转(将状态存储在某处),请卸载所有约束并生成新约束。如果您有协调器,请在协调器的
animateAlongsideTransition
块参数中安装它们和[self.view layoutIfNeeded]
。否则只需安装和布局。 - 覆盖
viewDidLayoutSubviews
并使用self.view.bounds.size
和nil
调用此方法
- 覆盖
viewWillTransitionToSize:withTransitionCoordinator:
并适当地调用您的方法