【问题标题】:AutoLayout constraints to resize scroll view when content size is dynamically loaded动态加载内容大小时调整滚动视图大小的 AutoLayout 约束
【发布时间】:2016-10-02 20:06:09
【问题描述】:

我有一个带有多个视图的情节提要场景,包括一个带有自己的视图控制器的容器视图。场景的主视图希望能够在其所有内容上垂直滚动,但所有内容(包括滚动视图的内容窗格)的大小都需要由 AutoLayout 设置。我一直在尝试遵循此处和苹果文档中其他几个问题给出的解释,但似乎有一个特定于我正在尝试做的事情的障碍:

容器视图有一个项目列表,每个项目都显示在一个方框中。这些框架在每行中平铺五个,根据需要尽可能多的行。这些项目的数量可能随时变化,因此网格的最终高度是未知的。但是,网格的高度确实取决于容器的宽度,因为必须始终有五个跨度。

因此,一个合理的约束应该是这样的:

container.height = (0.2 * numberOfRows) * containerWidth + 0.0

根据文档,我应该设置这个约束来强制滚动视图的contentSize 以适应所有被滚动的东西。

但是,您会注意到,当我使用 IBOutlet 保存它时,此约束的 numberOfRows 组件会动态变化——这是约束的 multiplier 属性的一部分。当我试图让内容获取回调更改乘数时,它会出现编译器错误,因为multiplier 是只读的。

如何在仍然使用自动布局的同时动态更改滚动条子视图的高度?

这张图片希望能显示出我正在尝试做的事情。最后一个容器视图上方的所有内容都与约束正确对齐。最后一个应该有一个正方形网格(未知计数)。我以编程方式创建的布局约束正确地给了正方形的大小。但目前,滚动视图的内容大小被固定为滚动视图的大小,而不是被扩展为包含高大的拼贴画——所以不会发生滚动!

【问题讨论】:

    标签: ios xcode swift uiscrollview autolayout


    【解决方案1】:

    我发现这个问题发生的原因是我没有正确使用“占位符约束”。基本上,我必须设置所有约束,就好像我不打算更改代码中的任何帧一样。但是,在与我的程序化框架更改发生冲突的一个约束上——底部容器的高度——我必须在检查器窗格中启用“占位符(在构建之前删除)”。我想这允许 Interface Builder 假设高度维度将在运行时提供。

    这样做的一个警告是,现在不受约束的高度是不可预测的,直到我手动设置它。所以我不得不去在viewDidLoad中设置一个默认的初始高度。

    据我所知,这将是执行此类操作的正确方法,直到创建诸如“仅加载约束”之类的内容-影响初始加载位置的约束,但在放置框架时不进行约束又出来了。但是,不知道这是否会发生甚至可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2016-12-24
      • 1970-01-01
      • 2016-05-03
      • 2015-07-27
      • 2013-03-08
      相关资源
      最近更新 更多