的开发者, 我在界面生成器(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


当前回答

你需要创建一个UIView作为UIScrollView的子视图,如下所示:

ui UIView 'Main View' UIScrollView UIView容器视图 (内容)

第二步是创建UIScrollView约束。我用它的superView的顶部,底部,前导和尾部约束做到了这一点。

接下来,我为UIScrollView容器添加了约束,这就是问题开始的地方。当你放置相同的约束(顶部,底部,前面和后面)时,Storyboard会给出一个警告消息:

“可滚动内容宽度不明确”和“可滚动内容高度不明确”

继续使用上面相同的约束,只需要在容器视图中添加等高等宽的约束,而不是与你的UIScrollView相关。换句话说,容器视图的约束被绑定到UIScrollView的父视图。

在此之后,您的Storyboard中将没有警告,您可以继续为子视图添加约束。

其他回答

如果你仍然有UIScrollView的问题,只要关闭内容布局指南 (在xcode Interface Builder中选择你的ScrollView ->在右侧面板中选择尺寸检查器->取消选择“内容布局指南”) 或者试试这些步骤:xcode 11滚动视图布局-它可以 对新的版式很有用。适用于macOS 10.15.2, Xcode 11.3.1, 05.02.2020

看到截图

我得到了同样的错误。我已经做了以下工作

视图(父视图) 滚动视图0,0600600 ScrollView中的UIView: 0,0,600,600 UIView包含图像视图,标签

现在为scrollView(2)和UIView(3)添加开头/结尾/顶部/底部。

选择视图(1)和视图(3)设置相同的高度和重量。它解决了我的问题。

我已经做了一个视频,这将会有所帮助:

https://www.youtube.com/watch?v=s-CPN3xZS1A

Xcode 11+, Swift 5

如果你想知道为什么所有的答案都不再工作了,请确保你已经固定了内容视图(你已经放在滚动视图内的那个)到滚动视图的内容布局指南,而不是框架布局指南。

内容视图边缘(前导,后拉,顶部,底部)不应该像图像-框架布局指南上的前导那样被固定

但像这样-内容布局指南。

然后大部分答案都会适用于你。

现在最简单的方法是这样的:

把滚动视图放到根视图中 将滚动视图的所有边固定在父视图上 取另一个UIView(我们称之为content view)把它放到滚动视图中 将内容视图的所有边固定在滚动视图的内容布局指南上 固定内容视图的宽度等于滚动视图的框架布局指南 以任何你想要的方式固定内容视图的高度(我在下面的例子中使用了常量高度约束)

总的来说,在最简单的实现中,你的结构是这样的

我知道我可能晚了,但是下一个解决方案无需额外的代码就解决了这类问题,只是使用故事板:

对于你的内容视图,你需要设置前/后/上/下空格到滚动视图的约束,这不会改变内容视图框架,如下所示:

当然,您需要为内容视图创建额外的约束,以便滚动视图可以知道内容大小。例如,设置固定高度和中心x。

希望这能有所帮助。

我想这是10秒后的作品。我在XCode 7.3中观察到它,并制作了一个视频。检查:

https://www.youtube.com/watch?v=yETZKqdaPiI

你所要做的就是给UIScrollView添加一个宽度和高度相同的子视图。然后选择ViewController并按下Reset到建议的约束。为了更清楚地理解,请查看视频。

谢谢