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


当前回答

在Interface Builder的大小检查器中设置ViewController(持有UIScrollView的ViewController)的大小为Freeform,所有这些都应该工作。

在界面构建器的大小检查器中为包含UIViewcontroller的自由形式设置

其他回答

正如在之前的回答中提到的,你应该在滚动视图中添加一个自定义视图:

将所有子视图添加到内容视图。 在某些时候,你会看到滚动内容视图有模糊的内容大小警告,你应该选择内容视图并单击“解决自动布局问题”按钮(在IB布局的右下角),并选择“添加缺少的约束”选项。

从现在开始,当你运行项目时,滚动视图将自动更新它的内容大小,不需要额外的代码。

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

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

我通过使用“解决自动布局问题”>“为所选视图添加缺失约束”来解决我的视图的这种问题

以下两个约束条件可以解决我的问题:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

中: 尾随,bottom是UIScrollView的尾随,底部

对我来说,添加contentView并没有像建议的那样真正起作用。此外,由于添加了视图,它会产生开销(尽管我不认为这是一个大问题)。对我来说最有效的方法是关闭我的scrollView的歧义检查。一切都布置得很好,所以我认为在像我这样简单的情况下是可以的。但是请记住,如果你的scrollView的其他约束被打破,Interface-Builder将不再就此警告你。

在我的情况下,我收到了不正确的内容大小和内容大小模糊的问题在iPad,但在iPhone的情况下工作。我在故事板中做了以下更改来解决这个问题。

在UIView中添加scrollview并添加约束前置,上,后,下到0,0,0,0。 设置滚动视图的高度根据要求,例如。One hundred. 添加UIView到滚动视图,并添加约束领先,顶部,尾部和底部0,0,0,0和对齐中心(X)和中心(Y)约束。 在滚动视图的尺寸检查器中取消选择“内容布局指南”。