使用界面构建器 - iOS复制包含“约束”的子项的对象

时间:2014-02-03 17:24:43

标签: ios xcode interface-builder

如何将带有约束的子对象的视图或对象复制到另一个视图?

每当我这样做时,目标物体只是一个混合物并修复它是一种痛苦。

5 个答案:

答案 0 :(得分:11)

前一段时间我遇到同样的问题,请告诉我是否有帮助: Preserve position when moving UIView in hierarchy (paste-in-place)

(复制于此处供参考):

杰伊的原始答案: https://stackoverflow.com/a/16952902/2070758

基本上,您不能直接复制/粘贴,但可以采取一些额外的步骤:

  1. 选择要移至新超级视图的所有视图,标签等
  2. 编辑 - >嵌入视图
  3. 将新创建的“容器”视图移动到您要粘贴到原始的视图
  4. 选择“容器”视图。编辑 - >解除嵌入。所有元素都将被转储到超级视图中,从而保持布局。

答案 1 :(得分:1)

它并不总能保持约束,但我发现移动一组视图并保持位置的一种方法是选择多个,然后用鼠标将视图拖动到新位置。您甚至可以通过复制/粘贴将保持所有定位的顶级对象将视图复制到新文件,然后使用鼠标在顶级视图对象之间拖动视图组。

答案 2 :(得分:1)

我只是遇到了这个问题,我只是将父视图复制到了我想移动的所有对象上,并且保留了所有约束!这是Xcode 10

答案 3 :(得分:0)

我不得不将一个非常复杂的AutoLayout设置从一个地方复制到另一个地方,所以我一直在寻找避免手动重新创建所有约束的方法。

我最终做的是非常小心地修改接口文件的原始XML。方法如下:

<强> !!! Without proper care, you might corrupt your interface file !!!
!!! Have a backup before attempting this !!!

步骤1:
使用常规Interface Builder,将所有视图从旧视图移动到新的superview。不要担心,如果它们搞砸了(例如,所有这些都集中在新的superview中,或者很多AutoLayout错误)。只要他们的视图层次结构得以保留,就可以了。

步骤2:
找出旧的和新的超级视图的对象ID。这些内容显示在“实用工具”部分(右侧)Identity Inspector > Document > Object ID中。该ID看起来像gGH-lW-Bke

enter image description here

步骤3:
以XML格式打开界面文件(右键单击storyboard/xib > Open As > Source Code)。

enter image description here

现在,非常仔细地查找并将旧超级视图的对象ID替换为新的(如果适用)的对象ID。不要做'替换所有'!你应该只在以下的地方改变它:
<constraint firstItem="gGH-lW-Bke" firstAttribute="top" secondItem="RXG-iN-Ra7" secondAttribute="top" id="u46-2d-oD0"/>

(您需要替换列为idfirstItem的旧视图secondItem

即使如此,也许在你的情况下,有一些不应该改变的约束(例如,与你刚刚移动但与旧的superview相关的视图根本没有关联的约束)! 小心谨慎

如果您需要更加安全,并且如果您的设置过于棘手,您可能希望首先(在步骤1之前)列出您将要移动的所有视图的对象ID列表以及(即将被遗弃的)超级视图的约束。

步骤4:
正常打开界面文件(右键单击&gt;打开为&gt;界面生成器)。验证所有看起来不错,没有警告或错误。

完成。

答案 4 :(得分:0)

我发现将多个项目嵌入堆栈中,然后复制(甚至复制到同一视图)会产生问题,

只需将项目拖放到水平或垂直堆栈中,然后进行复制-使用键盘快捷键粘贴整个堆栈即可并保持约束。

使用XCode 11.4.1