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

问题描述 投票:19回答:4

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

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

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

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

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

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

我的问题

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

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

ios iphone uiview interface-builder autolayout
4个回答
10
投票

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

indiestack.com/2013/12/transplanting-constraints

简而言之,方法是:

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

警告:这将打破你可能设置的限制的任何出口。其他东西,观点等的出口......都没问题。


3
投票
  • 选择所有视图
  • 转到编辑器 - >嵌入 - >视图
  • 再次选择所有视图
  • 添加新约束,pin top,bottom,leading,trailing为0

enter image description here


0
投票

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

它们看起来不正确,因为它们失去了父母的限制。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.