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

sky*_*der 23 interface-builder uiscrollview ios autolayout xcode6

我有:

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

我在界面生成器"有不明确的可滚动内容宽度"中发出警告. 在此输入图像描述

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

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

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

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

sky*_*der 46

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

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

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

1

所有,我们要做的是:

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

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

2

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

PS

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

  • 优秀的人才队伍!在这件事上花了半个小时!在我添加底部约束之前,我收到了该消息.此外,当我滚动时,它总是返回到滚动视图的顶部.因此,在添加此约束后,它最终滚动正常加警告消失!Thaaank你!@skywinder (2认同)
  • 非常感谢你为这个解决方案.我发现当有多个元素(例如:3个UIButtons一个接一个地垂直对齐)时,必须在最底层添加约束.https://github.com/skywinder/scrollViewAmbigous/pull/1 (2认同)
  • 当ScrollView的子视图意图是scrollview本身的整个高度/宽度时,这似乎不起作用.考虑一个适合视口的滚动视图,其中有几个"卡"也是视口的大小.当高度/宽度可变地取决于视图时,您无法对高度/宽度进行硬编码. (2认同)

小智 8

问题:

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

方案:

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

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

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

  • 滚动视图的"等宽"和"高度"将呈现内容视图,因此滚动视图无用. (7认同)