如何将带有约束的子对象的视图或对象复制到另一个视图?
每当我这样做时,目标物体只是一个混合物并修复它是一种痛苦。
答案 0 :(得分:11)
前一段时间我遇到同样的问题,请告诉我是否有帮助: Preserve position when moving UIView in hierarchy (paste-in-place)
(复制于此处供参考):
杰伊的原始答案: https://stackoverflow.com/a/16952902/2070758
基本上,您不能直接复制/粘贴,但可以采取一些额外的步骤:
答案 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
。
步骤3:
以XML格式打开界面文件(右键单击storyboard/xib > Open As > Source Code
)。
现在,非常仔细地查找并将旧超级视图的对象ID替换为新的(如果适用)的对象ID。不要做'替换所有'!你应该只在以下的地方改变它:
<constraint firstItem="gGH-lW-Bke" firstAttribute="top" secondItem="RXG-iN-Ra7" secondAttribute="top" id="u46-2d-oD0"/>
(您需要替换列为id
或firstItem
的旧视图secondItem
即使如此,也许在你的情况下,有一些不应该改变的约束(例如,与你刚刚移动但与旧的superview相关的视图根本没有关联的约束)! 小心谨慎 。
如果您需要更加安全,并且如果您的设置过于棘手,您可能希望首先(在步骤1之前)列出您将要移动的所有视图的对象ID列表以及(即将被遗弃的)超级视图的约束。
步骤4:
正常打开界面文件(右键单击&gt;打开为&gt;界面生成器)。验证所有看起来不错,没有警告或错误。
完成。
答案 4 :(得分:0)
我发现将多个项目嵌入堆栈中,然后复制(甚至复制到同一视图)会产生问题,
只需将项目拖放到水平或垂直堆栈中,然后进行复制-使用键盘快捷键粘贴整个堆栈即可并保持约束。
使用XCode 11.4.1