UIScrollView + 居中视图 + 模糊的可滚动内容大小 + 多个iPhone尺寸

25

我有以下内容:

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

我在接口构建器中收到警告“具有模糊的可滚动内容宽度”。 enter image description here

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

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

我创建了Github存储库来说明这个问题:ScrollViewAmbigous

这不是UIScrollView可滚动内容大小的歧义的重复,但很相似(并且没有得到答案),但此问题特别涉及不同尺寸的iPhone。
3个回答

46

在喝着一杯清新的咖啡的早晨,我想出了解决这个问题的方法!

所以,这是最简单情况下的初始状态:

  1. scrollView没有与边缘相关的限制约束条件
  2. 按钮在水平和垂直方向上居中并具有固定的宽度和高度
  3. 当然还有讨人厌的“具有不明确的可滚动内容宽度”和“具有不明确的可滚动内容高度”的警告。

1

我们需要做的只有:

  • 添加2个额外的约束条件,例如我们视图(在我的例子中为UIButton)的“0”的尾部和/或底部空间

重要提示:您必须添加尾部和/或底部的约束条件。 不要添加“前导和顶部” - 这样不起作用!

2

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

P.S.

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


2
耶!这个东西我花了半个小时才搞定!在我添加底部约束之前,我一直收到那个警告。而且当我滚动时,它总是返回到滚动视图的顶部。所以在添加了这个约束之后,它终于可以正常滚动了,而且警告也消失了!感谢你!@skywinder - manosim
2
非常感谢您提供的解决方案。我发现当有多个元素时(例如:3个垂直对齐的UIButtons依次排列),约束必须添加到最下面的一个。https://github.com/skywinder/scrollViewAmbigous/pull/1 - coder9
2
当ScrollView的子视图应该是滚动视图本身的全高/宽时,这似乎不起作用。考虑一个适合视口并具有几个“卡片”的滚动视图,这些卡片也是视口的大小。当高度/宽度可变取决于视图时,您无法硬编码高度/宽度。 - d2burke
@d2burke 好的。你有解决这个问题的方法吗?如果你知道更好的解决方案,请添加另一个答案 - skywinder
没错,那就是我所指的。然而,两者都没有解决子视图应填充滚动视图的整个宽度/高度的问题。如果我的情况很紧急,可以通过在viewDidLayoutSubViews中设置滚动视图内容大小来快速修复,但我正在寻找仅基于自动布局的解决方案。 - d2burke
显示剩余6条评论

8

问题

  1. 警告提示我们ScrollView的内容大小取决于其子视图。
  2. 如果您的子视图没有任何位置和大小的严格规则(没有固定约束),它将会使Nib生成的ScrollView内容大小混乱。

解决方法

  1. 将只有一个子视图作为ScrollView的“contentView”。

  2. 为该'contentView'添加严格(固定)约束。

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

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


7
如果滚动视图的宽度和高度相等,将导致内容视图以及滚动视图变得无用。 - Darvish Kamalia
在运行时,您可以将contentView的底部更改为contentView中最底部视图的底部。这样,您就可以更改contentView的高度。 - Hitendra Solanki
感谢您的解决方案。为什么滚动视图必须具有内容视图?它不应该自己理解滚动视图中添加的任何内容都应按给定顺序滚动吗? - A_G
@AsthaGupta 因为UIScrollView是UIView的子类,具有额外的属性、方法、代理等。因此它比UIView更加丰富。而.contentView只是一个简单的UIView。基本上在UIScrollView中使用.contentView可以更好地管理。 - Timur X.

0

这个问题似乎存在很多混淆。我的看法是,UIScrollView必须有两个尾部空间约束,一个“内部”约束将其连接到其中一个子视图(以便它知道其内容宽度),另一个“外部”约束将其连接到兄弟或父视图,以便它知道其框架宽度。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接