的开发者,
我在界面生成器(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
更新
如今,苹果意识到我们多年前解决的问题(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中);设置也对齐中心水平和垂直;
你需要创建一个UIView作为UIScrollView的子视图,如下所示:
ui
UIView 'Main View'
UIScrollView
UIView容器视图
(内容)
第二步是创建UIScrollView约束。我用它的superView的顶部,底部,前导和尾部约束做到了这一点。
接下来,我为UIScrollView容器添加了约束,这就是问题开始的地方。当你放置相同的约束(顶部,底部,前面和后面)时,Storyboard会给出一个警告消息:
“可滚动内容宽度不明确”和“可滚动内容高度不明确”
继续使用上面相同的约束,只需要在容器视图中添加等高等宽的约束,而不是与你的UIScrollView相关。换句话说,容器视图的约束被绑定到UIScrollView的父视图。
在此之后,您的Storyboard中将没有警告,您可以继续为子视图添加约束。
这是我自己回答的问题UIScrollView +居中视图+模糊可滚动内容大小+许多iPhone大小的答案。
但它也完全覆盖了你的案子!
这是最简单情况的初始状态
所有边都有0个约束的scrollView
按钮居中水平和垂直与固定的宽度和高度约束
当然,恼人的警告具有模糊的可滚动内容宽度和模糊的可滚动内容高度。
我们所要做的就是
添加2个额外的约束,例如“0”用于视图的尾部和/或底部空间(请看下面截图中的例子)。
重要的是:你必须添加结尾和/或底部约束。不是“领先和领先”——这不是工作!
你可以在我的示例项目中检查它,演示如何修复这个问题。
P.S.
根据逻辑,这个动作应该导致“冲突约束”。但是没有!
我不知道为什么它工作,以及Xcode如何检测哪个约束更优先级(因为我没有为这些约束显式设置优先级)。
如果有人在下面的评论中解释一下为什么它能起作用,我会很感激的。