更改方向的自动布局约束
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.size
和nil
调用此方法
覆盖 viewWillTransitionToSize:withTransitionCoordinator:
并适当地调用您的方法
【讨论】:
以上是关于更改方向的自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章