更改方向的自动布局约束

Posted

技术标签:

【中文标题】更改方向的自动布局约束【英文标题】:Changing Auto Layout constraints for orientation 【发布时间】:2016-05-03 16:47:21 【问题描述】:

我有一个应用程序的布局不同,具体取决于它是纵向还是横向(特别是高度 > 宽度)。在旋转时,在viewWillTransitionToSize:withTransitionCoordinator: 中,我适当地更新了一些自动布局约束的常量。问题是此时视图的框架还没有真正旋转,所以我经常在调试器中收到一条愤怒的消息,说我的约束不能满足。

我的问题是这样的:我在旋转序列中的什么时候修改约束以使视图的框架已经改变,但我仍然在旋转旁边看到动画?

This question 建议在willAnimateRotationToInterfaceOrientation 中调用[self.view setNeedsUpdateConstraints],但该方法现在已弃用。我尝试在 viewWillTransitionToSize 中调用该方法,但仍然收到愤怒的消息。

【问题讨论】:

那个是iphone应用还是通用应用???因为如果您只想在纵向和横向模式下更改 iphone 的 UI,请使用 size classes buddy :) 无需添加、修改或删除约束 buddy :) 您可以在故事板本身中处理所有内容 @SandeepBhandari 这是一款通用应用程序,因此无法根据尺寸等级判断 iPad 是纵向还是横向。 如果 iPad 是横向的,然后用户激活了分屏,会发生什么?考虑纵向与横向不再合适。你需要开始围绕尺寸类设计你的界面。 @Curmudgeonlybumbly 我知道。我将横向定义为视图宽度>视图高度。尺寸等级不能具体告诉我。 iPad 全屏是双向的常规尺寸等级。 【参考方案1】:

我似乎已经解决了。请参阅 this article 和 PureLayout。基本上:

实现类似-(void)updateConstraintsForSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator; 的方法 在此方法中,如果您已旋转(将状态存储在某处),请卸载所有约束并生成新约束。如果您有协调器,请在协调器的 animateAlongsideTransition 块参数中安装它们和 [self.view layoutIfNeeded]。否则只需安装和布局。 覆盖viewDidLayoutSubviews 并使用self.view.bounds.sizenil 调用此方法 覆盖 viewWillTransitionToSize:withTransitionCoordinator: 并适当地调用您的方法

【讨论】:

以上是关于更改方向的自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章

自动布局 [Snapkit] 更改旋转约束

纵向而不是横向的自动布局方向更改

针对不同方向的不同自动布局约束集

在 Swift 中,当方向发生时如何更改表格单元格布局?

使用自动布局更改约束

如何更改自动布局约束