我正在为iPhone和iPad开发应用程序。它支持iOS6和iOS7,并且它仅使用自动布局。
上周,当Apple宣布iOS8已准备好迎接黄金时段时,我将其中一部iPhone和iPad升级至iOS8。我还将我的XCODE提升到版本6.我有第二部iPhone,我在iOS7上留下了。
我使用Xcode 6生成了新的可执行文件,当我在运行iOS8的设备上执行时,我看到他们的屏幕布局混乱,但在iOS7上仍然很好。在我的物理设备和Xcode的仿真器上都是如此。
虽然我不知道为什么,但我现在很清楚发现了什么。
具体来说,iOS8上的某些自动布局操作失败了,但在iOS7上它们没问题。
一些涉及按钮的示例,我将其置于基本视图上,其大小等于屏幕大小:
(1)如果我要求自动布局将按钮的水平中心(CX)定位为等于基础视图的水平中心,则结果是按钮的水平中心位于基础视图的左边缘。
(2)如果我要求自动布局使按钮的宽度等于底层视图宽度的50%,则它根本没有宽度。
我能够解决以下问题:
(1)我要求自动布局将按钮的中心定位为等于底层视图的左边缘加上屏幕宽度的50%。
(2)我要求自动布局使按钮的宽度等于屏幕宽度的50%。
我正在慢慢地抓住我的方式,使用像这样的解决方法,回到iOS7和iOS8上适用于我的自动布局代码。但我真的很想知道这里发生了什么。
看起来自动布局无法确定基础视图的大小,因此需要该信息失败的自动布局计算。但它确实知道视图的顶部和左边缘在哪里,因此基于这些数据的计算成功。
这是一款大型应用,我为iOS6和iOS7编写了数百行自动布局代码,非常适合我。
我一直在调试并尝试使用iOS8进行为期三天的工作,而且当我开始时,我并不比我更聪明。
任何人对此可能存在的问题有什么建议或想法?
答案 0 :(得分:11)
@robmayoff对此有一个很好的答案:https://stackoverflow.com/a/26066992/1424669
基本上,在iOS8中,您无法再在视图上调用setNeedsUpdateConstraints
和setNeedsLayout
,并期望更新子视图的约束。
您必须在约束正在更改的视图上调用这些方法。这与iOS7向后兼容。
示例:强>
假设您有一个带有根视图self.view
的ViewController和一个名为containerView的子视图。 containerView附加了一个NSLayoutConstraint
,您想要更改(在这种情况下,顶部空间)。
在iOS7中,您可以通过请求根视图的新布局来更新VC中的所有约束:
self.containerView_TopSpace.constant = 0;
[self.view setNeedsUpdateConstraints];
[self.view setNeedsLayout];
在iOS8中,您需要在containerView上请求布局:
self.containerView_TopSpace.constant = 0;
[self.containerView setNeedsUpdateConstraints];
[self.containerView setNeedsLayout];
答案 1 :(得分:3)
您可能会发现此问题的答案有用:UICollectionView cell subviews do not resize
在大多数情况下,iOS7中的工作而不是iOS 8自动布局问题的工作似乎源于在iOS 8中未正确调整大小的根视图,特别是当我们将translateAutoresizingMaskIntoConstraints设置为NO时。对于我的观点,我能够在layoutSubviews中设置根视图的框架(或者具有正确边界的任何适当的初始化程序),这解决了这个问题。
self.contentView.frame = CGRectInset(self.bounds, 0, 0);
如上面的答案所示,您也可以
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
然后在开始在代码中设置自己的约束之前将translatesAutoresizingMaskIntoConstraints转回NO。
绝对讨厌我们花了很多时间来处理这些讨厌的陷阱。
答案 2 :(得分:0)
就我而言,问题与标有UIView-Encapsulated-Layout-Width
和UIView-Encapsulated-Layout-Height
的约束有关。当我删除它们时,一切都表现得好像我的视图是零大小,一切都集中在屏幕的左上角。当我离开时,新的约束按预期工作。我还保留了标记为_UILayoutSupportConstraint
的约束。