UIScrollView +中心视图+ Ambigous Scrollable内容大小+许多iPhone大小

我有:

  • 应用程序,应该在横向和纵向模式下工作。
  • 在顶部查看全尺寸滚动视图。
  • 滚动视图内部的一些视图具有固定的宽度和高度。 (增加了H和W约束)
  • 设置为在容器中以水平居中的方式查看滚动视图内部。 (根据约束添加)

我在界面构建器“有不明确的可滚动内容宽度”中发出警告。 在此处输入图像描述

我知道解决这个问题的唯一方法是设置尾随和前导约束。 但对于不同的iPhone(5.5“,4.7”,4“),我需要设置不同的尾随和前导约束。

如何消除此警告并且仍然具有针对所有iPhone尺寸的固定W和H的水平视图居中?

我创建Github repo来说明这个问题: ScrollViewAmbigous

这与UIScrollView Scrollable Content Size Ambiguity不重复,但它类似(虽然没有回答),但这个问题尤其与不同大小的iPhone有关。

早上喝了一杯新鲜的咖啡,我找到了解决这个问题的方法!

所以,这是最简单案例的初始状态:

  1. scrollView对所有边都有0个约束
  2. 按钮居中水平和垂直,固定宽度和高度
  3. 并且,当然Has ambiguous scrollable content widthHas ambiguous scrollable content height 恼人的警告

1

所有,我们要做的是:

  • 添加2个附加约束,例如“0”表示视图的尾部和/或底部空间(在我的例子中 – UIButton)

重要提示:您必须添加尾随和/或底部约束。 不是“领先和顶级” – 它不起作用!

2

您可以在我的示例项目中检查它,演示如何解决此问题: ScrollViewAmbigous

PS

我不知道为什么它有效以及Xcode如何检测哪个约束更优先(因为我没有为这些约束明确设置优先级),但如果有人解释,为什么它在下面的评论中起作用,我会感激不尽。

问题

  1. 警告告诉我们,scrollview的内容大小取决于其子视图。
  2. 虽然您的子视图没有任何严格的位置和大小规则(没有固定的约束),但它会混淆nib生成的scrollview内容大小。

方案

  1. 仅将一个子视图作为scrollview的“contentView”。
  2. 向’contentView’添加严格(固定)约束。

    最佳实践:滚动视图的宽度和高度相等。

  3. 将所有其他子视图和约束添加到“contentView”。

在这个问题上似乎有很多混乱。 我的看法是UIScrollView必须有两个尾随空间约束,一个’内部’连接它的一个子视图(因此它可以知道它的内容宽度),另一个’外部’连接它到兄弟或超级视图所以它知道它的框架宽度。

同样的原则适用于高度,即两个底部空间约束。