有时,UILayoutGuides数组中的两个subviews位于数组的末尾,有时则不是。如果我试图使视图出现在最上面的视图后面,这种不一致是非常有问题的!
这可能是一个Xcode错误,因为一天,一切都很好,第二天有两个额外的子视图,我调整了,第二天的结果喜忧参半。所以-它是取决于某种设置,还是这是一个bug?最好不用过滤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子视图。请不要在这里使用快速枚举,因为这并不保证接收方数组中对象的顺序。
- (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;
}发布于 2014-04-19 06:49:01
布局指南不是视图,也不应该被视为视图!是一个实现细节,您不应该依赖它作为视图布局逻辑。遍历subviews数组也不被认为是好做法,因为系统可能会在那里添加子视图,而这些子视图可能不是您所期望的(令人惊讶的是,它已经添加了!)
您应该跟踪哪个视图是最顶层的,并使用insertSubview:belowSubview:在层次结构中的正确位置添加子视图。
https://stackoverflow.com/questions/23166758
复制相似问题