【问题标题】:Embed Views in super view without losing autolayout constraints在超级视图中嵌入视图而不会丢失自动布局约束
【发布时间】:2014-05-09 10:09:36
【问题描述】:

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

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

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

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

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

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

我的问题

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

有没有一种方法可以将所有视图放在一个超级视图中并具有相同的自动布局约束,而不必重新创建它们? 谢谢

【问题讨论】:

标签: ios iphone uiview interface-builder autolayout


【解决方案1】:
  • 选择所有视图
  • 转到编辑器 -> 嵌入 -> 视图
  • 再次选择所有视图
  • 添加新约束,将顶部、底部、前导、尾部固定到 0

【讨论】:

  • 你是救生员。我在父视图中手动添加并且不得不再次重新设置所有约束。这使事情变得更容易。只是一点点补充说明:选择视图时,不要选择安全区域或整个层次结构的根视图
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    正如上面 cmets 中提到的,这种方法对我很有效:

    indiestack.com/2013/12/transplanting-constraints

    简而言之,方法是:

    1. 为您的旧超级视图提供一个 restoreId,以便您可以在 XML 中轻松识别它。
    2. 在文本编辑器视图中打开您正在使用的 XIB/Storyboard。
    3. 将当前存在的内容复制并粘贴到备份文件中。
    4. 使用情节提要将您的内容嵌入到新的超级视图中。暂时不要设置任何新的约束。
    5. 为您的新超级视图提供一个恢复 ID,以便您可以在 XML 中轻松识别它。
    6. 并排打开当前 Storyboard/XIB 与您备份的旧 Storyboard/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. 不要忘记为新容器添加与旧容器匹配的约束(在我的情况下,这是将新容器固定到超级视图的所有边缘)。

    警告: 这将打破您可能设置的限制的任何出口。其他事物、观点等的出口……会很好。

    【讨论】:

    • 这仍然运行良好。在我的情况下,唯一不同的是我需要用新容器视图的 id 替换“安全区域”的 id,因为所有约束最初都是针对它的,而不是视图控制器父视图...
    • 注意:如果您有大小等级变化,您必须在移植中包含<variation> 块。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多