使用iOS7的代码在iOS7上运行良好的自动解决问题

我正在为iPhone和iPad开发一个应用程序。 它支持iOS6和iOS7,它只使用自动布局。

上个星期,当苹果公司宣布iOS8准备好黄金时,我升级了一台iPhone和一台iPad到iOS8。 我也碰到了我的XCODE版本6.我有第二个iPhone,我留在iOS7。

我使用Xcode 6生成了新的可执行文件,当我在运行iOS8的设备上执行它们时,看到它们的屏幕布局混乱,但在iOS7上仍然很好,我感到非常痛心。 在我的物理设备和Xcode的仿真器上都是如此。

我花了很多时间挖掘,但是我现在很清楚发生了什么,尽pipe我不知道为什么。

具体来说,某些自动布局操作在iOS8上失败了,但在iOS7上却没有问题。

一些涉及一个button的例子,我把它放在一个底层视图的大小等于屏幕的大小:

(1)如果我要求自动布局将button的水平中心(CX)定位为等于底层视图的水平中心,则结果是button的水平中心位于底层视图的左边缘。

(2)如果我要求自动布局来使button的宽度等于底层视图的宽度的50%,那么它根本没有宽度。

我能够解决这些问题如下:

(1)我要求自动布局将button的中心定位为等于底层视图的左边缘加上屏幕宽度的50%。

(2)我要求自动布局使button的宽度等于屏幕宽度的50%。

我慢慢地用自己的方式来解决这些问题,回到适用于iOS7和iOS8的自动布局代码。 但是我真的很想知道这里发生了什么事情。

它看起来像自动布局不能确定基础视图的大小,所以自动布局计算,要求信息失败。 但它确实知道视图的顶部和左边的位置,以便这些数据的计算成功。

这是一个大型的应用程序,我已经写了数百行iOS6和iOS7的自动布局代码,完全适合我。

我一直在用iOS8调整和尝试三天,而且我并不比我刚开始的时候更聪明。

任何人有什么build议或想法可能是这里的问题?

@robmayoff有一个很好的答案: https ://stackoverflow.com/a/26066992/1424669

实质上,在iOS8中,您不能再在视图上调用setNeedsUpdateConstraintssetNeedsLayout ,并期望子视图的约束更新。

您必须在约束发生变化的视图上调用这些方法。 这是向后兼容iOS7。

例:

假设你有一个ViewController的根视图self.view和一个子视图叫做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]; 

您可能会发现这个问题的答案有帮助: UICollectionView单元格子视图不会resize

在大多数情况下,iOS7中的作品,而不是iOS8的自动布局问题似乎源于iOS 8中的根视图的大小不正确,特别是当我们将translatesAutoresizingMaskIntoConstraints设置为NO时。 对于我的观点,我能够在layoutSubviews中设置根视图的框架(或者具有正确界限的适当的初始化工具),并解决了这个问题。

 self.contentView.frame = CGRectInset(self.bounds, 0, 0); 

如上面的答案所示,你也可以这样做

 self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 

然后在您开始在代码中设置您自己的约束之前,将translatesAutoresizingMaskIntoConstraints转换回NO。

绝对讨厌这么多的时间是用这些恼人的陷阱去做的。

在我的情况下,与UIView-Encapsulated-Layout-WidthUIView-Encapsulated-Layout-Height约束相关的问题。 当我删除它们时,所有事情都像我的视图是零大小一样,一切都集中在屏幕的左上angular。 当我离开他们时,新的限制按预期工作。 我还保留了标有_UILayoutSupportConstraint的约束。