的开发者, 我在界面生成器(Xcode 5 / iOS 7)中的自动布局遇到了麻烦。 这是非常基础和重要的,所以我认为每个人都应该知道这是如何正确工作的。如果这是Xcode中的一个bug,那它就是一个严重的bug !

所以,每当我有这样的视图层次结构时,我就会遇到麻烦:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView有固定的约束,例如,每边50px(没问题)。 然后我添加一个顶部空间约束UILabel(没有问题)(我甚至可以钉标签的高度/宽度,改变什么,但应该是不必要的,由于标签的内在大小)

当我给UILabel添加一个尾随约束时,问题就开始了:

例如,尾随空间到:Superview等于:25

现在出现了两个警告——我不明白为什么:

A)滚动内容大小不明确(滚动视图具有不明确的滚动内容高度/宽度)

B)视图错位(Label Expected: x= -67 Actual: x= 207)

我在一个新项目中做了这个最小的例子,你可以下载,我附上了一张截图。如你所见,Interface Builder期望Label位于UIScrollView的边界之外(橙色虚线矩形)。用解决问题工具更新标签的框架,将其移到那里。

请注意:如果你用一个UIView替换UIScrollView,行为是预期的(标签的帧是正确的,根据约束)。所以看起来要么是UIScrollView有问题,要么是我错过了一些重要的东西。

当我运行应用程序而不更新标签的框架时,它的位置很好,正是它应该在的地方,UIScrollView是可滚动的。 如果我确实更新了帧,标签就会从视野中消失,UIScrollView也不会滚动。

帮帮我,欧比王·克诺比!为什么是模棱两可的布局?为什么会出现这种错位的观点?

你可以在这里下载示例项目,试着看看你能弄清楚发生了什么: https://github.com/Wirsing84/AutoLayoutProblem


当前回答

@Matteo Gobbi的答案是完美的,但在我的情况下,滚动视图不能滚动,我删除“对齐中心Y”,并添加“高度>=1”,滚动视图将成为可滚动的

其他回答

这是我自己回答的问题UIScrollView +居中视图+模糊可滚动内容大小+许多iPhone大小的答案。

但它也完全覆盖了你的案子!

这是最简单情况的初始状态

所有边都有0个约束的scrollView 按钮居中水平和垂直与固定的宽度和高度约束 当然,恼人的警告具有模糊的可滚动内容宽度和模糊的可滚动内容高度。

我们所要做的就是

添加2个额外的约束,例如“0”用于视图的尾部和/或底部空间(请看下面截图中的例子)。

重要的是:你必须添加结尾和/或底部约束。不是“领先和领先”——这不是工作!

你可以在我的示例项目中检查它,演示如何修复这个问题。

P.S.

根据逻辑,这个动作应该导致“冲突约束”。但是没有!

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

更新

如今,苹果意识到我们多年前解决的问题(lol_face),并提供内容布局指南和框架布局指南作为UIScrollView的一部分。因此,您需要执行以下步骤:

与以下原始回复相同; 对于这个contentView,设置顶部,底部,左边和右边的边距为0,将它们固定到滚动视图的内容布局指南; 现在将contentView的高度设置为Frame Layout Guide的高度。对宽度做同样的操作; 最后,将等高约束的优先级设置为250(如果您需要视图垂直滚动,宽度水平滚动)。

完成了。

现在你可以在contentView中添加所有的视图,scrollView的contentSize会自动根据contentView调整大小。

不要忘记从contentView中最后一个对象的底部设置约束到contentView的边缘。

原始(弃用)

So I just sorted out in this way:

在UIScrollView里面添加一个UIView(我们可以称之为contentView); 在这个contentView中,将上,下,左,右边距设置为0(当然是从scrollView,也就是superView中);设置也对齐中心水平和垂直;

看看这个非常快速和点的教程,如何让滚动视图工作,完全可滚动与自动布局。现在,唯一让我感到困惑的是,为什么滚动视图的内容大小总是大于必要的..

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

你只需要确保有办法使它连续 从滚动视图的顶部到底部的约束行。 (-X-X-X)

在我的例子中——一个水平滚动的滚动视图——我还需要为滚动视图的每个子视图添加宽度和高度限制,尽管苹果的技术说明没有告诉你这一点。

Xcode 11 +。

使用自动布局的最简单方法:

Add UIScrollView and pin it 0,0,0,0 to superview (or your desired size) Add container of UIView type inside ScrollView, pin it 0,0,0,0 to all 4 sides and center it horizontally and vertically. In size inspector of container, change bottom and align center Y priority to 250. (for horizontal scroll change trailing and align center X) Add all views that you need into said container (UIView). Don't forget to set the bottom constraint on the lowest view. Select the UIScrollView, select the size inspector and deselect Content Layout Guides.