【问题标题】:ios7 empty autolayout layout already ambiguousios7空的自动布局布局已经模棱两可
【发布时间】:2013-09-24 09:14:04
【问题描述】:

我刚刚为面向 iOS7 的“单视图应用程序”创建了一个空的 iOS 项目,但是当我运行空项目并通过键入以下内容检查我的视图树时:

po [[UIWindow keyWindow] _autolayoutTrace]

我得到的结果是两个布局指南已经模棱两可了

*<UIWindow:0x108f537f0> - AMBIGUOUS LAYOUT
|   *<UIView:0x109409850>
|   |   *<_UILayoutGuide:0x109409c10> - AMBIGUOUS LAYOUT
|   |   *<_UILayoutGuide:0x10940a540> - AMBIGUOUS LAYOUT

是否有理由摆脱这些警告 - 还是我可以直接忽略它们?

【问题讨论】:

    标签: ios ios7 autolayout


    【解决方案1】:

    如果你不想使用 Autolayout 或者去 Interface Builder 并自己添加布局,你可以忽略它们(你甚至可以让 XCode 添加它认为需要的布局)

    【讨论】:

    • 我确实想使用自动布局 - 但为什么“自动添加”视图已经模棱两可?
    • 只要去界面生成器,让 XCode 添加建议的布局,让我添加一个捕获
    • 谢谢 - 我认为他们自己的观点模棱两可仍然很奇怪,但很高兴知道我可以忽略这一点。
    【解决方案2】:

    iOS 6 也是如此。

    我想有时约束条件“稳定下来”而不是模棱两可需要时间。根据 WWDC 2012 视频“Best Practices for Mastering Auto Layout”,可以暂时容忍歧义(不像不可满足会立即引发异常)。

    如果您想向自己证明您的约束没有模棱两可,请为 [[UIWindow keyWindow] _autolayoutTrace] 创建一个包装器,并在短暂延迟后调用它:

    - (void)viewDidAppear:animated
    {
        [super viewDidAppear:animated]; 
    
        [self performSelector:@selector(wrapperForLoggingConstraints) withObject:nil afterDelay:.3];
    }
    
    - (void)wrapperForLoggingConstraints
    {
        [[UIWindow keyWindow] _autolayoutTrace];
    }
    

    您必须在 UIWindow 上创建一个类别才能使其正常工作:

    @interface UIWindow()
    
    + (UIWindow *)keyWindow;
    - (NSString *)_autolayoutTrace;
    
    @end
    

    我把这个类别放在了它自己的头文件中,UIWindow_AutoLayoutDebug.h

    每当我在我的应用中调用 [[UIWindow keyWindow] _autolayoutTrace] 时,我都会导入 UIWindow_AutoLayoutDebug.h

    我从 raywenderlich.com 团队的“iOS 6 by tutorials”第 1 卷一书中了解到如何在代码中调用 [[UIWindow keyWindow] _autolayoutTrace]。延迟通话的想法是我自己的。

    【讨论】:

    • 任何人都可以验证这个技巧是合法的吗?在 viewDidAppear 中调用 _autolayoutTrace 后,我在视图中有几个 AMBIGUOUS LAYOUT 警告。在延迟 0.3 秒后调用 _autolayoutTrace 后,它们都消失了。只是想知道这是否可以信任,我还在学习自动布局并想确保我一切都好。
    • 这对我不起作用,因为它无法编译。您只能在 lldb 会话中调用 _autolayoutTrace。它不会像上面写的那样编译。您可以将 UIView 方法称为“hasAmbiguousLayout”,但这会告诉您有关单个视图的信息,而不是它的后代。为此,需要编写一种方法来递归遍历所有子视图并在每个子视图上调用 hasAmbiguousLayout。请记住,仅用于开发时间,不适用于发布代码。
    • @idStar 您必须在 UIWindow 上创建一个类别(请参阅更新的答案)
    • 对我来说它们并没有消失,即使我延迟了 1 秒。
    • 在视图出现后,我在断点内调用 _autolayoutTrace -- 并在 UIWindow 和 UILayoutGuides 上获得 AMBIGUOUS LAYOUT。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2014-11-23
    • 1970-01-01
    • 2013-06-21
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多