Xcode - 有没有办法将组件从一个视图拖到另一个视图而不会丢失它的框架?

时间:2012-07-16 12:18:37

标签: ios xcode interface-builder

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

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

9 个答案:

答案 0 :(得分:213)

另一种解决方案:

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

答案 1 :(得分:28)

我发现了一些可能对你有帮助的东西!

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

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

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

它适用于OSX 10.8.2和Xcode 4.6。

祝你好运!

答案 2 :(得分:22)

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

  1. 在Interface Builder中添加与潜在子视图相同级别的父视图。
  2. 在文本编辑器中打开故事板,并将父视图的子视图标记内的可能子视图复制。保存后,XCode将更新。
  3. 虽然不是很优雅,但是看不出为什么XCode不支持Shift或其他东西。

答案 3 :(得分:10)

  1. 选择要从一个UIView移动到另一个UiView(可能是孩子)或ScrollView

  2. 的所有控件
  3. 剪切/复制

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

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

  6. 注意:我在XCode 4.2上

答案 4 :(得分:4)

我做了类似Stepan的解决方案,没有使用故事板。在IB中,ViewController的视图是打开的:

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

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

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

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

答案 7 :(得分:1)

我发现了另一种方法。它基本上是:Move = Cut + Paste

这样做:

  • 将所有子视图设为新父视图(P')
  • 的子视图
  • 保留(几乎)基于自动布局的故事板中的所有约束
  • 保持子视图的相对位置(框架)彼此

这样你不会:

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

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

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

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

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

从原始父母视图(P)中你:

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

<强>之前:

  

视图1

     

视图2

     
    

P

         
      

SVS-你想学对移动

             

SVS-你-拒收想对移动

    
  
     

VIEW3

<强>后:

  

视图1

     

视图2

     
    

P

         
      

SVS-你-拒收想对移动

    
  
     

VIEW3

     
    

P&#39;

         
      

的SV&#39; -you-想到移动

    
  

我应该强调,如果你有例如UIScrollView作为父视图。然后,它的副本将再次是UIScrollView,这可能是不可取的。

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

答案 8 :(得分:0)

帮助我解决此问题的是-

  1. 在xib的根目录级别上创建所需的父视图(滚动视图或uiview),并相应地调整其大小
  2. 复制所有要作为该父视图的子视图的视图,并将其粘贴到您在步骤1中创建的新视图上。
  3. 这时,您将复制这些视图。新添加的视图将错位,但彼此之间的顺序和距离仍然相同,将它们在xib中对齐,以使其边界与同一视图的旧副本匹配(这假设新的父视图具有与旧边界相同的边界)
  4. 新添加的视图将失去一些约束,请参考旧视图以解决这些问题
  5. 从xib删除旧视图