Xcode-有没有一种方法可以将组件从一个视图拖动到另一个视图而又不会丢失其框架?


91

我想做的是在Xcode的interface-builder中将组件/视图从一个超级视图拖到另一个视图,而无需重置其框架/位置。

Xcode在执行此操作时的默认行为似乎是在保持其尺寸不变的情况下,使视图在其新的超级视图中垂直和水平移动居中。这非常令人沮丧,因为这意味着需要在新的超级视图中手动重新定位视图。但是在移动它之前,我已经正确放置了它,因此我希望Xcode仅记住其框架的所有属性,而不仅仅是其宽度/高度。这可能吗?


在过去的时间,如果您剪切和粘贴框架保持不变。试试看。
David H

感谢您的建议,不幸的是它似乎没有用。否则,我只是将其剪切/粘贴错了。发生的是XCode将我要粘贴的视图替换为我要粘贴的视图(如果我尝试一次粘贴多个内容,它将仅使用列表中的第一项)。复制执行相同的操作。
aroth 2012年

尝试将其粘贴到左侧列-列表中。选择超级视图,然后粘贴。否则,对不起,出于建议。
David H

尝试了两种方式。不起作用 最终不得不这样做。
aroth

stackoverflow.com/questions/12034293/中似乎有一种解决方法,但这不是很好
Eugene Osovetsky 2012年

Answers:


223

另一个解决方案:

  1. 在子视图中选择所需的项目,然后
  2. (在工具栏中)编辑器>嵌入>要嵌入的视图类型。

12
谢谢。这应该是公认的答案。选择要移至新超级视图的所有视图->嵌入视图->将新容器视图移至所需超级视图->编辑器-未嵌入。瞧!所有视图都在具有正确框架的新超级视图中。
Accatyyc

18
不幸的是,任何自动布局约束都不会被复制,我见过的唯一方法是手动编辑Xib的xml:indiestack.com/2013/12/transplanting-constraints
James

1
仍然很奇怪的一件事是,当我将子视图嵌入到新的超级视图中时,该超级视图具有奇怪的坐标。它以-20 x和-20 y开始,然后,如果我将其设置为0,0,则一切都偏离中心。
user3344977 2015年

1
@詹姆斯我曾经那样做。但是我发现,如果在Xcode 6中使用Command-X_Command-V视图,则将遵守粘贴视图之间的约束。小改进。
史蒂文·克雷默

4
我尝试使用Command-X和Command-V的@StevenKramer对我不起作用。您还有更多步骤可以做到吗?我很感兴趣
2015年

28

我发现了一些可以帮助你们的东西!

任务是将“子视图”重新分组为“父视图”,以便它们成为父视图的子视图,并像实际操作一样保留显示的物理位置。

首先,调整父视图以实际覆盖子视图的区域。其次,确保所有的孩子都在视图列表中使用它。

现在,用鼠标选择所有子级,然后将它们向上移动一个像素,例如向下移动一个像素(也就是说IB会有一些变化)。释放孩子之后,他们将神奇地成为父母的孩子,并保持自己的位置。

它适用于OSX 10.8.2和Xcode 4.6。

祝好运!


太棒了...这甚至不会破坏插座和框架。嵌入视图可中断帧。剪切粘贴方法会破坏出口和框架。
jeet.chanchawat

22

我设法节省了大量时间来重新放置内容,并执行以下操作:

  1. 在与可能的子视图相同的级别上,在Interface Builder中添加父视图。
  2. 在文本编辑器中打开情节提要,然后在父视图的subviews标签内复制可能的子视图。保存后,XCode将进行更新。

虽然不是很优雅,但无法理解为什么XCode不支持Shift或其他功能。


3
这是在Xcode 5中始终如一地为我工作的唯一答案。“ Editor-> Embed In”似乎应该是正确的答案,但它并不总是列出我要将子视图移动到的视图。
登顿

10
  1. 选择要从一个UIView移到另一个UiView(不是孩子)或ScrollView的所有控件

  2. 剪切/复制

  3. 现在,将新的UIView / ScrollView拖动到现有的UIView之后,不要单击一次以将其选中,而是双击新的UIView / ScrollView并粘贴所有控件。

  4. 所有控件之间的距离差异将保持不变,但是您可能不得不重新定位控件。因此,在重新放置控件之前,不要单击任何地方,只需通过导航箭头重新放置所有控件,因为它们都已被选中,或者您可能必须再次选择它们。

注意:我在XCode 4.2上


嘿,如果这行得通,那么这是最好的答案(将多个控件拖动到现有视图中)
Colin

@me在Xcode 4.6.2上,无法通过双击打开辅助视图窗口,因此该方法不起作用。
Colin

在Xcode 5中可以正常工作。相对位置保持不变,只是垂直位置已关闭,但这很容易立即重新放置整个组。
2013年

不好的事情是,您失去了自动布局约束:'( indiestack.com/2013/12/transplanting-constraints在这里您可以找到“移植”约束的方式
琼·卡多纳

4

我已经完成了与Stepan解决方案类似的操作,而没有使用情节提要。在IB中,当ViewController的视图打开时:

  1. 除了VC的主视图之外,创建另一个视图
  2. 通过将所有子视图从一个视图拖动到另一个视图,将所有子视图移动到第二个视图(从左侧列表中拖动以重置其位置)。如果无法使用鼠标从IB中选择它们,则从左侧列表中选择所有子视图,然后使用“ cmd”按钮从IB面板中选择一个最终子视图。
  3. 将它们返回到初始主视图上的最终视图。
  4. 删除所有添加的视图。

2

这是将子视图复制到另一个视图并保留位置的最佳解决方案:

  1. 在子视图中选择所需的项目,然后
  2. 编辑器->嵌入->视图
  3. 复制此视图(Cmd + C)
  4. 撤消(Cmd + Z)(因为您只想要子视图)
  5. 转到想要子视图的视图并将其粘贴(Cmd + V)
  6. 选择要复制粘贴的嵌入视图,然后选择编辑器->未嵌入

第6步将删除嵌入视图,您将只复制了子视图。


2

当将父视图拖放到另一个视图(UIView,ScrollView,StackView)时,Xcode Interface Builder陷入混乱

问:将
一个视图(其中包含许多其他子视图)嵌入到ScrollView或另一个顶级视图中,与我到目前为止所看到的并不直接。此后不久发生的事情是,所有子视图似乎都由于找不到原始框架而被放错了位置。

答:请
按照以下步骤操作,您将可以更轻松地解决它:

  1. 在子视图中选择所需的项目,然后
  2. 转到菜单栏,编辑器->嵌入->视图
  3. 将这个新视图(Cmd + C)与子视图一起复制(对于我来说,目前所有约束都保留到现在为止)
  4. 转到想要子视图进入的视图(无论是ScrollView还是StackView),然后粘贴(Cmd + V)复制的视图
  5. 选择粘贴的嵌入视图(您之前新创建的),然后转到Xcode的菜单栏,编辑器->未嵌入

不,还没有完成!有时,您可能会遇到与UI约束有关的问题,您将不得不相应地解决它们。


1

我发现了另一种方法。基本上是:移动=剪切+粘贴

这样,您可以:

  • 让所有子视图成为新父视图(P')的子视图
  • 在基于自动布局的情节提要中保留(几乎)所有约束
  • 保持子视图的相对位置(框架)彼此相对

这样,您不会:

  • 在文本编辑器中编辑Storyboard文件

事实是,情节提要中除一个(根)视图外的每个视图都有其父视图。接下来,当您复制/移动多个子视图时,会丢失框架和约束

答案很简单。您可以通过将子视图(SV)的父视图(P)复制到新的父视图(P')中来进行复制。这样,您可能只需要重新创建从该父新视图(P')到其新父视图的约束,而无需重新创建要移动的每个子视图。

在将父视图(P)的副本复制到新视图(P')后,您可以:

  • 删除除您要移动的孩子以外的所有孩子
  • 重新创建新的父(P')约束
  • 重新创建(SV)的可能的Interface Builder出口

从原始父视图(P),您:

  • 删除所有您想移动的孩子

之前:

查看1

视图2

P

您想要移动的SV

SV不想移动

视图3

后:

查看1

视图2

P

SV不想移动

视图3

P'

SV您想要移动

我要强调的是,如果您将UIScrollView作为父视图,则这不能很好地概括。然后,它的副本将再次是UIScrollView,这可能不是所希望的。

另一件事是,当您确实删除了原始父视图(P)中的某些子视图(SV)时,如果其他(不可移动的子视图)引用了它们,则可能需要重新创建一些约束。但是您还是应该这样做。


0

帮助我解决了这个问题的是-

  1. 在根目录级别的xib中创建所需的父视图(滚动视图或uiview),并相应调整其大小
  2. 复制要成为该父视图的子视图的所有视图,并将它们粘贴到您在步骤1中创建的新视图上
  3. 此时,您将复制这些视图。新添加的视图将错位,但彼此之间的顺序和距离仍然相同,请将它们在xib中对齐,以使其边界与同一视图的旧副本匹配(这假设新的父视图与旧有相同的界限)
  4. 新添加的视图将失去一些约束,请参考旧视图以修复这些约束
  5. 从Xib删除旧视图
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.