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


当前回答

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

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

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

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

我们所要做的就是

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

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

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

P.S.

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

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

其他回答

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

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

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

谢谢

This error took me a while to track down, initially I tried pinning the ScrollView's size but the error message clearly says "content size". I made sure everything I pinned from the top of the ScrollView was also pinned to the bottom. That way the ScrollView can calculate its content height by finding the height of all the objects & constraints. This solved the ambiguous content height, the width is pretty similar... Initially I had most things X centered in the ScrollView, but I had to also pin the objects to the side of the ScrollView. I don't like this because the iPhone6 might have a wider screen but it will remove the 'ambiguous content width' error.

使用自动布局

在一个定义良好的视图中添加滚动视图,然后在滚动视图中添加堆栈视图

从滚动视图和堆栈视图中添加上、左、右、下、中心X和中心Y约束到相关的超级视图中

确保约束从堆栈视图链接到正确的父视图(scrollview),因为当前默认设置是添加Align Top约束,而不是Top Space约束。

垂直滚动

添加一个带有约束0,0,0,0的UIScrollView到superview。 在ScrollView中添加一个UIView,约束为0,0,0,0到superview。 为UIScrollView添加相同宽度的约束。 添加高度到UIView。 向UIView添加带有约束的元素。 对于最靠近底部的元素,确保它有一个到UIView底部的约束。

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

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