使用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中,您不能再在视图上调用setNeedsUpdateConstraints
和setNeedsLayout
,并期望子视图的约束更新。
您必须在约束发生变化的视图上调用这些方法。 这是向后兼容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-Width
和UIView-Encapsulated-Layout-Height
约束相关的问题。 当我删除它们时,所有事情都像我的视图是零大小一样,一切都集中在屏幕的左上angular。 当我离开他们时,新的限制按预期工作。 我还保留了标有_UILayoutSupportConstraint
的约束。