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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在超级视图中嵌入视图而不会丢失自动布局约束相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

我的问题

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

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

答案

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

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. 不要忘记向新容器添加与旧容器匹配的约束(在我的情况下,这会将新容器固定到超级视图的所有边缘)。

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

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

enter image description here

另一答案

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

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

另一答案

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

以上是关于在超级视图中嵌入视图而不会丢失自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局扩展方形视图以填充矩形超级视图

iOS 从超级视图中删除对象会破坏自动布局并禁用滚动视图

自动布局约束未正确放置容器视图

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

自动布局约束不会设置为 SuperView 的边缘 [重复]

故事板自动布局将视图放置在表格单元格中,并将尾随到超级视图约束固定到最左侧