【问题标题】:Container view with dynamic height inside UIScrollView with auto layout具有自动布局的 UIScrollView 内具有动态高度的容器视图
【发布时间】:2015-02-03 16:00:11
【问题描述】:

我有一个 UIScrollView,它嵌套在一个内容视图中,其中嵌套了两个子视图,一个具有已知高度的常规 UIView,一个具有动态高度的容器视图,具体取决于内容。像这样:

视图如下所示:

我的约束设置如下:

滚动视图被限制在其父视图(即视图)的尾随、前导、顶部和底部边缘

内容视图受限于其父视图(即滚动视图)的尾随、前导、顶部和底部边缘 它还具有与主视图(即视图)相等的宽度约束,因此滚动视图的宽度与屏幕宽度相同。

顶视图被限制在其父视图(即内容视图)的前、后和顶部边缘

容器视图被限制在其父视图(内容视图)的尾部、前导和底部边缘 它的上边缘也被限制在 Top View 的下边缘。

Container View 的视图层次结构如下所示:

左上角的标签被限制在其父视图的尾部、前导和顶部边缘。 右下角的标签被限制在其父视图的尾部、前导和底部边缘。 顶部标签对底部标签有垂直约束。为了我的测试目的,我将这个垂直约束设置得特别大(1000 分)。

这应该使内容视图的高度约为 1000 点。

我的理解是现在为容器视图解决了一个高度,即内容视图将调整为顶部视图的高度 + 容器视图的高度。

但 IB 抱怨如下:

它想要调整 Container View 的大小并将其高度设为 0。如果我给 Container View 一个明确的高度,那么一切都会按预期工作,但这不是我想要的,因为 Container View 可以根据其动态变化内容大小。

感谢任何帮助!

【问题讨论】:

    标签: ios autolayout


    【解决方案1】:

    您必须在 UIScrollView 中提供足够的约束信息,以便它可以计算其 contentSize。对于您的情况,您必须为容器视图提供高度约束。您可以 IBOutlet 高度约束并相应地更新其值。

    【讨论】:

    • 这是我发现的唯一一个真正有效果的答案!谢谢 !好主意!
    【解决方案2】:

    在你的情况下,如果你想摆脱关于容器高度的 IB 警告应该为零。您可以使用适合您的任何常量值设置高度约束,并将其作为占位符进行检查(它将在构建时删除。)

    【讨论】:

      【解决方案3】:

      我发现有两件事可以帮助我解决同样的问题。

      问题一:容器高度

      我希望容器视图自行调整大小,但 IB 希望容器视图有一个明确的高度。由于 IB 对视图的内容一无所知,因此它无法知道容器视图的内容可以自行调整大小。最简单的方法是从 Size Inspector 为容器视图设置 Placeholder Intrinsic Content Size

      这有效地使 IB 高兴,而无需应用任何高度限制。另一种选择是在容器上添加“在构建时删除”高度约束。

      问题2:子视图控制器视图的高度

      子视图控制器的根视图默认使用AutoresizingMask,这是任何UIViewController 中最顶层视图的标准。我对此的解决方案是在添加子视图控制器时禁用prepareForSegue 中的AutoresizingMask。在 parent 视图控制器中尝试以下操作:

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          super.prepare(for: segue, sender: sender)
      
          if let childViewController = segue.destination as? ChildViewControllerClass {
              childViewController.view.translatesAutoresizingMaskIntoConstraints = false
          }
      }
      

      在父视图中进行更改可确保如果子视图在 UINavigationController 内的其他地方重用,则视图的大小将正确。

      在进行该更改之前,我不断收到与称为 UIView-Encapsulated-Layout-Height 的约束冲突的 AutoLayout 错误,我认为这是从基于 AutoresizingMask 的根 UIViewController 视图上的布局派生的约束的名称。

      【讨论】:

      • 是的,确切地说,如果您正确设置 translatesAutoresizingMaskIntoConstraints 标志,自动布局会执行所有计算高度的操作,并且一切都会像魅力一样发挥作用。非常感谢!
      • 在 IB 中,包含的视图必须设置约束,这意味着包含的视图大小。由于 IB 将检查占位符大小和包含视图大小之间的约束一致性,因此建议将包含视图的约束之一设置为低优先级(但在运行时它将正常运行)
      猜你喜欢
      • 2013-05-25
      • 2016-08-27
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多