在超级视图中嵌入视图而不会丢失自动布局约束

时间:2014-03-29 23:43:38

标签: ios iphone uiview interface-builder autolayout

在ios应用程序中

我有一个自定义的UITableViewCell,里面有很多视图。我正在使用自动布局并根据需要设置所有约束。

但现在我需要一个主视图(在内容视图中)并将所有其他视图放入其中(某种父视图)。

这是我的单元格在界面构建器中的外观示例:

enter image description here

它具有使用约束设置的所有视图。

我知道有一个xcode功能可以在父视图中嵌入选定的视图:

enter image description here

所以我选择所有视图并选择将它们嵌入到视图中。我得到以下内容:

enter image description here

我的问题

虽然视图已在superview中正确嵌入,但自动布局约束已被删除,现在我必须重新创建它们。

有没有办法可以将所有视图放在superview中并具有相同的autolayout约束,而无需重新创建它们? 谢谢

4 个答案:

答案 0 :(得分:10)

正如上面的评论所述,这种方法对我很有用:

indiestack.com/2013/12/transplanting-constraints

简而言之,方法是:

  1. 为旧的superview提供一个restoreId,以便您可以轻松地在XML中识别它。
  2. 在文本编辑器视图中打开您正在使用的XIB / Storyboard。
  3. 将当前的内容复制并粘贴到备份文件中。
  4. 使用故事板将您的内容嵌入到新的超级视图中。不要设置任何新约束。
  5. 为您的新超级视图提供一个恢复ID,以便您可以轻松地在XML中识别它。
  6. 与您备份的旧故事板/ XIB并排打开当前的故事板/ XIB。
  7. 通过搜索还原ID在备份的XML中查找旧容器视图。复制<constraints></constraints><subviews></subviews>代码
  8. 中的所有内容
  9. 在当前XML中查找新容器视图,并将其<constraints></constraints><subviews></subviews>标记的内容替换为复制的内容
  10. 进入旧XML并复制旧容器的ID。
  11. 进入新的XML,并将您从步骤9获得的旧ID替换为您粘贴的<constraints></constraints>内所有位置的新容器的ID。
  12. 不要忘记为新容器添加与旧容器匹配的约束(在我的情况下,这会将新容器固定到超级视图的所有边缘)。
  13. 警告: 这将打破您可能已设置的限制的任何出口。其他东西,观点等的出口都没问题。

答案 1 :(得分:3)

  • 选择所有观看次数
  • 转到编辑器 - &gt;嵌入 - &gt;图
  • 再次选择所有视图
  • 添加新约束,pin top,bottom,leading,trailing to 0

enter image description here

答案 2 :(得分:0)

您是否尝试过创建容器视图的约束?您不需要重新创建所有约束。

它们看起来不正确,因为它们失去了父约束条件。

答案 3 :(得分:0)

在xib的顶层创建一个新视图。然后将现有视图拖入其中。现有的限制仍然存在。您只需为嵌入设置新的约束。