ios - 为什么 UILayoutGuide 在 subviews 数组中的顺序不一致?

标签 ios objective-c autolayout

有时subviews数组中的两个UILayoutGuides在数组的末尾,有时不是。如果我试图让一个 View 出现在最顶层 View 的正后方,这种不一致是非常有问题的!

这可能是一个 Xcode 错误,因为有一天,一切都很好,第二天有两个额外的 subview ,我进行了调整,第二天结果好坏参半。那么 - 它取决于某种设置还是这是一个错误?最好不必过滤 subview 数组或检查 subviewClass 或检查是否 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/

相关文章:

ios - 带有 UITableViewCells + AutoLayout 的 UITableView - 不像*应该*那样平滑

ios - 带有 UITapGestureRecognizer 的 UIView 上的 UITableView(单元格选择不起作用)

iphone - 在 iPhone 中捕获视频和图像

iphone - 一个文件中的两个 UITableView

objective-c - NSString:isEqual 与 isEqualToString

ios - 在 Xcode 6 中启用自动布局时,标签无法正确调整文本

ios - Xcode/iOS NSUserDefaults 行为奇怪

objective-c - 如何存储很长的十六进制序列?

ios - 在移动到登录屏幕之前在欢迎屏幕中显示视频

ios - 无法将原型(prototype)单元的高度设置为 Storyboard中的约束