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