当我在Interface Builder中移动控件并传递UIView时。无论如何都要阻止IB将控件嵌入到UIView中并使其成为树层次结构中UIView的子级。
BEFORE
+UIView
+UIButton
+UIView
如果我用鼠标移动UIButton并将其置于UIView IB上方,将使其成为UIView的孩子
AFTER
+UIView
+UIButton
+UIView
无论如何都要锁定底部视图。我经常将它们用作背景并对它们进行着色。
答案 0 :(得分:3)
您可以在拖动元素的同时按住 Cmd ,而无需嵌入即可重新定位。
编辑:这只能用于Xcode 7。
答案 1 :(得分:0)
我放弃并决定所有控件组都应该有一个父UIView。可以是不可见的(clearColor的backgroundColor)
选择所有控件,然后选择编辑器菜单>嵌入视图。
之后我们可以安全地在他们自己的分组视图中移动它们,而不会跳过层次结构中的级别。
Embed in View的一个问题是使用标记和viewWithTag:
如果使用多个VC控制器和标记子视图构建视图,请确保标记ID在整个视图层次结构中是唯一的。
这是因为viewWithTag:只返回与id匹配的第一个控件,并且在向下移动一个级别继续搜索之前,似乎搜索ACROSS视图层次结构。
因此,如果您选择编辑菜单>嵌入视图您将控件向下移动到层次结构中的一个步骤。因此,对viewWithTag:999的调用之前可能已经拾取了您的控件,但现在可能会返回完全不同的控件。
它也可能崩溃! 将UIView的结果转换为控制例如UIImageView是很常见的 然后在控件上调用方法。 如果viewWithTag找到的控件不同于预期的控件,它甚至可能不是UIImageView,因此调用缺少的方法会抛出异常。
基本上从不使用标签,因为您必须在XIB和代码中进行调试,而不检查重复的ID。 从XIB拖动到.h并改为创建出口。