有时subviews
数组中的两个UILayoutGuides
在数组的末尾,有时不是。如果我试图让一个 View 出现在最顶层 View 的正后方,这种不一致是非常有问题的!
这可能是一个 Xcode 错误,因为有一天,一切都很好,第二天有两个额外的 subview ,我进行了调整,第二天结果好坏参半。那么 - 它取决于某种设置还是这是一个错误?最好不必过滤 subview
数组或检查 subview
的 Class
或检查是否 conformsToProtocol:UILayoutSupport
只是为了做到这一点。
从我的控制台:
(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>>
)
但正如我所说,有时这些并不在数组的末尾。
我开始认为这不是 Xcode 错误,因为我刚刚重新启动它并得到相同的结果。
现在,我已经实现了这个方法,这样我就可以在它上面调用 lastObject 并获得正确的非 UILayoutGuide subview 。一定不要在这里使用快速枚举,因为这不能保证对象在接收器数组中的顺序。
- (id)filteredSubviews:(UIView *)onView
{
NSMutableArray *filteredSubviews = [@[] mutableCopy];
for (int i = 0; i < onView.subviews.count; i++)
{
id subview = onView.subviews[i];
if ([subview isMemberOfClass:[UIView class]])
{
[filteredSubviews addObject:subview];
}
}
return filteredSubviews;
}
最佳答案
布局指南不是 View ,不应被视为 View !它是一个实现细节,您不应依赖它来实现 View 布局逻辑。遍历 subviews
数组也不是好的做法,因为系统可能会在那里添加 subview ,而这些 subview 可能不是您期望的(惊喜,它已经做到了!)。
您应该跟踪哪个 View 在最上面,并使用 insertSubview:belowSubview:
在层次结构中的正确位置添加 subview 。
关于ios - 为什么 UILayoutGuide 在 subviews 数组中的顺序不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166758/