92

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

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

4

9 回答 9

225

另一种解决方案:

  1. 在子视图中选择您想要的项目,然后
  2. (在工具栏中)编辑器>嵌入>要嵌入的视图类型。
于 2013-06-06T02:40:34.873 回答
28

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

任务是将“子视图”重新组合为“父视图”,以便它们分层地成为父视图的子视图,并在显示时保留操作前的物理位置。

首先,调整父视图以物理覆盖子视图的区域。其次,确保所有孩子都在视图列表中低于它。

现在用鼠标选择所有的孩子并移动它们,例如向上一个像素和向下一个像素(只是说IB有一些变化)。之后释放孩子,他们将神奇地成为父母的孩子并保持他们的立场。

它适用于 OSX 10.8.2 和 Xcode 4.6。

祝你好运!

于 2013-02-04T19:36:16.350 回答
22

我设法节省了大量重新定位东西的时间,并做到了:

  1. 在 Interface Builder 中将父视图添加到与可能的子视图相同的级别。
  2. 在文本编辑器中打开故事板,然后将可能的子视图复制到父视图的子视图标签内。XCode 将在您保存后更新。

虽然不是很优雅,但不明白为什么 XCode 不支持 Shift 或其他东西。

于 2012-10-12T17:15:15.490 回答
10
  1. 选择要从一个 UIView 移动到另一个 UiView(可能是子项)或 ScrollView 的所有控件

  2. 剪切/复制

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

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

注意:我在 XCode 4.2

于 2013-05-29T16:26:40.147 回答
4

我做了一些类似于 Stepan 的解决方案,但没有使用情节提要。在 IB 中,当 ViewController 的视图打开时:

  1. 在VC的主视图之外再创建一个视图
  2. 通过将所有子视图从一个视图拖动到另一个视图将所有子视图移动到第二个视图(从左侧列表中拖动重置它们的位置)如果您无法使用鼠标从 IB 中选择它们,则从左侧列表中选择全部然后使用“cmd”按钮从 IB 面板中选择一个最终子视图。
  3. 将它们带回初始主视图上的最终视图。
  4. 删除添加的视图,一切就绪。
于 2012-12-19T08:38:33.633 回答
2

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

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

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

于 2017-07-13T11:19:07.300 回答
2

将父视图拖放到另一个视图(UIView、ScrollView、StackView)时,Xcode Interface Builder 会出现混乱

问:
将一个视图(其中包含许多其他子视图)嵌入到 ScrollView 或另一个顶级视图中并不像我目前所看到的那样直截了当。不久之后发生的事情是所有子视图似乎都放错了位置,因为它找不到它们的原始框架。

A:
按照以下步骤,您将能够尽可能轻松地解决它:

  1. 在子视图中选择您想要的项目,然后
  2. 转到菜单栏,编辑器 -> 嵌入 -> 视图
  3. 复制这个带有子视图的新视图(Cmd+C)(对我来说,目前所有的约束都被保留了)
  4. 转到您希望子视图所在的视图(无论是 ScrollView 还是 StackView)并粘贴(Cmd+V)复制的视图
  5. 选择粘贴的嵌入视图(您之前新创建的)并转到 Xcode 的菜单栏,编辑器 -> 取消嵌入

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

于 2018-11-30T14:51:23.063 回答
1

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

这样你就可以:

  • 让所有子视图成为新父视图 (P') 的子视图
  • 将(几乎)所有约束保留在基于自动布局的故事板中
  • 保持子视图的相对位置(帧)一个到另一个

这样您就不会:

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

基础是,除了 Storyboard 中的一个(根)视图之外,每个视图都有其父视图。接下来,当您复制/移动多个子视图时,您会丢失帧和约束

答案很简单。您通过将子视图 (SV) 的父视图 (P) 复制到新的父视图 (P') 来制作子视图 (SV) 的副本。这样,您可能只需要重新创建从该父新视图 (P') 到其新父视图的约束,而不是为您想要移动的每个子视图重新创建约束。

在您将父视图 (P) 复制到新视图 (P') 中后,从该新视图 (P') 中,您:

  • 删除所有孩子,除了你想移动的孩子
  • 重新创建新的父 (P') 约束
  • 为(SV')重新创建可能的 Interface Builder 出口

从原始父视图 (P) 你:

  • 删除所有要移动的孩子

前:

视图1

视图2

想要移动的 SV

SVs-你不想移动

视图3

后:

视图1

视图2

SVs-你不想移动

视图3

P'

SVs'-你想搬家

我应该强调的是,如果您将 UIScrollView 作为父视图,这并不能很好地概括。然后它的副本将再次成为 UIScrollView,这可能是不可取的。

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

于 2016-10-11T09:06:22.673 回答
0

帮助我解决这个问题的是——

  1. 在根级别的 xib 中创建所需的父视图(滚动视图或 uiview)并相应地调整其大小
  2. 复制您希望成为此父视图的子视图的所有视图,并将它们粘贴到您在步骤 1 中创建的新视图中
  3. 此时,您将复制这些视图。新添加的视图将是未对齐的,但仍以相同的顺序和相同的距离相互对齐,在 xib 中对齐它们以匹配它们的边界与同一视图的旧副本(这假设新的父视图与旧的界限相同)
  4. 新添加的视图会失去一些约束,参考旧视图修复
  5. 从 xib 中删除旧视图
于 2019-11-27T05:30:00.320 回答