为什么子视图数组中UILayoutGuide的顺序不一致?

时间:2014-04-19 06:30:20

标签: ios objective-c autolayout

有时UILayoutGuides数组中的两个subviews位于数组的末尾,有时则不是。如果我试图让视图出现在最顶层的视图后面,那么这种不一致就很成问题了!

这可能是一个Xcode错误,因为有一天,一切都很好,第二天有两个额外的子视图,我调整,第二天混合结果。那么 - 它取决于某种设置还是这个bug?如果不必过滤subview数组或检查Class的{​​{1}}或检查subview是否只是为了执行此操作,那将不错。

来自我的控制台:

conformsToProtocol:UILayoutSupport

但就像我说的那样,有时这些不在数组的末尾。

我开始认为这不是Xcode错误,因为我刚刚重新启动它并得到相同的结果。

现在,我已经实现了这个方法,以便我可以在其上调用lastObject并获得正确的非UILayoutGuide子视图。请确保不要在此使用快速枚举,因为这不能保证接收器阵列中对象的顺序。

(lldb) po [onView subviews]
<__NSArrayM 0x1708426d0>(
<UIView: 0x1701750c0; frame = (0 69; 768 887); autoresize = RM+BM; layer = <CALayer:     0x17022e2c0>>,
<UIView: 0x170175180; frame = (0 0; 768 69); autoresize = RM+BM; layer = <CALayer: 0x17022e3e0>>,
<UIView: 0x178173740; frame = (0 956; 768 68); autoresize = TM+BM; layer = <CALayer: 0x1782375a0>>,
<_UILayoutGuide: 0x170198e20; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x17022e660>>,
<_UILayoutGuide: 0x170199570; frame = (0 1024; 0 0); hidden = YES; layer = <CALayer: 0x17022e680>>
)

1 个答案:

答案 0 :(得分:2)

布局指南不是视图,不应该被视为这样!它是一个实现细节,您不应该依赖它来构建视图布局逻辑。遍历subviews数组也不被视为良好做法,因为系统可能会在那里添加可能不是您期望的子视图(惊讶,它已经做到了!)。

您应该跟踪哪个视图是最顶层的,并使用insertSubview:belowSubview:将子视图添加到层​​次结构中的正确位置。