如何使用自动布局来解决在Xcode 11 (iOS12,iOS13)中出现的“可滚动内容大小不明确”的问题

75

当使用自动布局(Auto Layout)时,我无法在Xcode 11 beta的视图控制器中设置一个简单的UIScrollView。我知道必须将滚动视图限制在边缘,并将滚动视图的宽度和高度设置为包含滚动视图的整个视图的宽度和高度。然而,当我尝试这样做时,我没有得到设置等宽和等高的选项。

当我从滚动视图向整个主视图进行右键拖动时,我会得到以下选项:

  • Leading Space to Safe Area(安全区域前导空间)
  • Top Space to Safe Area(安全区域顶部空间)
  • Trailing Space to Safe Area(安全区域尾随空间)
  • Bottom Space to Safe Area(安全区域底部空间)
  • Center Horizontally in Safe Area(水平居中对齐安全区域)
  • Center Vertically in Safe Area(垂直居中对齐安全区域)

在其他视频中,有一个“Equal Widths”和“Equal Heights”的选项,但我好像没有这个选项。

我是做错了什么吗,还是苹果更改了Xcode 11中滚动视图的工作方式?

9个回答

186

在“属性”中的“尺寸检查器”(标尺图标)中禁用内容布局指南。

在属性中禁用内容布局指南

我曾遇到同样的问题,通过禁用该选项问题得以解决。


2
我已经想出了另一种方法来让它工作,但这种方法要简单得多。谢谢! - Pranav Ramesh
@PranavRamesh 我正在使用自动调整大小功能,而且内容布局指南选项已经被禁用,但我仍然遇到了同样的问题。你还有其他解决方案吗? - Shehroz
@PranavRamesh,你还有其他的解决方案吗? - Prasann
2
尽管删除内容布局向导可以解决此警告,但我认为修复它的正确方法是在可能的情况下更新约束以符合内容布局向导或框架布局向导。 在我的情况下,我使用框架布局来设置前导,后续,顶部和底部; 并使用内容布局来设置宽度和高度,并解决了我的问题。 - Carlos Irano
@Shehroz Xcode会自动将内容视图的边缘约束到滚动视图框架布局中。只需从约束到框架布局更改为约束到父视图即可解决问题。当您在界面构建器中创建约束时,需要遍历所有四个约束并从框架布局切换到父视图。 - Pranav Ramesh

25
我也遇到了类似的问题。 找到了一份很好的指南,帮助了我:https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/。 基本上你需要9个约束条件(假设你只想垂直滚动): 1-4:ScrollView到Superview(顶部、底部、前导和后继方向)。确保将其连接到父视图而不是安全区域。 5-8:内容视图到内容布局指南(顶部、底部、前导和后继方向)。 9. 内容视图宽度等于框架布局指南的宽度。

2
对于1-4,使用安全区域也可以,并且我认为应该使用安全区域。 - Pranav Pravakar

2

禁用属性中的内容布局指南对我有帮助。


2

我也遇到了这个问题(版本11.0 beta 3 (11M362v))。我通过先在xcode10中设置布局,然后在xcode11中运行来解决了这个问题。目前还没有找到任何官方的说明证明这是xcode11的问题,但现在我猜测这是xcode11 beta版的问题。


2
在 Xcode-11 中,经过长时间的滚动问题研究后,得出结论:您必须在添加新约束时选择滚动选项。您可以参考以下屏幕截图来解决您的问题。

enter image description here

这些提到的解决方案对我起了作用。

我相信这是解决此警告的正确方法。对我有效,谢谢!在我的情况下,我使用了Frame Layout来设置leading、trailing、top和bottom;使用Content Layout来设置width和height。 - Carlos Irano

1
@Vadim的回答有所调整后有效。其他方法都无效,我不想禁用“内容布局指南”。既然苹果已经启用了它,为什么要禁用它呢?所以我肯定是漏掉了某些东西或者这是个bug。
Vadim的回答是:
I stacked with that problem as well. Found a good guide that helped me:
https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/
Basically what you need is 9 constraints (assuming you want to scroll only vertically):

1-4: ScrollView to Superview (top, bottom, leading, trailing). Make sure to connect it to parent view and not to safe area.

5-8: Content view to Content Layout guide (top, bottom, leading, trailing)

9: Content view Width equals width to Frame Layout Guide.

一切都很好,但是它没有起作用。

但是后来我意识到上面的6和8(“内容布局指南”的尾部和底部约束)约束有点奇怪。它们具有正常数值而不是零。就像下面的图片一样。(常量等于滚动视图的宽度和高度)。我将它们改为零,现在一切都正常了。

enter image description here


1
我曾经遇到过这个问题,但是我已经找到了解决方案。问题出在安全区域(Safe Area)enter image description here
  • 将滚动视图嵌入UIview中。
  • 将顶部、底部、右侧和左侧都设置为0。
  • 现在给滚动视图与此视图的约束。
  • 将内容视图的等高度和等宽度添加到此视图中。

父视图会自动提供安全区域。你所要做的就是将滚动视图嵌入UIview中,然后将内容视图的等高度和等宽度添加到此视图中。


0

对我来说,最初在ScrollView中,默认情况下Content Layout Guides是被禁用的。所以我只需启用和禁用Content Layout Guides,然后错误就自动消失了。


-1

Xcode 11+,Swift 5。

我解决了我的问题,我准备好了视频代码


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