UIScrollView可滚动内容大小的歧义

624

各位开发者们, 我在Interface Builder中(Xcode 5 / iOS 7)遇到了AutoLayout的问题。 这是非常基础且重要的,因此我认为每个人都应该知道如何正确地使用它。如果这是Xcode中的一个bug,那么这是一个关键性的问题!

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

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

UIScrollView的约束很稳定,例如:距每一侧50px(没有问题)。 然后我给UILabel添加了一个Top Space约束(没有问题)(我甚至可以固定标签的高度/宽度,这并没有改变什么,但由于标签的内在大小应该是不必要的)

当我给UILabel添加一个trailing constraint时问题就开始了:

例如,Trailing Space to: Superview Equals: 25

现在会发生两个警告 - 我不明白为什么:

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

B)未放置正确的视图(Label Expected: x=-67 Actual:x=207)

我在全新的项目中进行了这个最小化的例子,你可以下载,并且我附上了一个屏幕截图。正如你所看到的,界面生成器希望Label坐落在UIScrollView的边界之外(橙色虚线矩形)。使用Resolve Issues Tool更新标签的框架将其移动到那里。

请注意:如果您用UIView替换UIScrollView,则行为与预期相符( Label的帧是正确的,符合约束),因此UIScrollView似乎存在问题或者我漏掉了一些重要内容。

如果我不像IB建议的那样更新标签框架,就可以很好地定位它,正好在其应该处的位置,并且UIScrollView是可滚动的。 如果我更新标签,则标签被隐藏,UIScrollView无法滚动。

帮帮我,欧比万·克诺比!为什么出现模糊的布局? 为什么视图被放错了?

你可以在这里下载示例项目并尝试找出问题: https://github.com/Wirsing84/AutoLayoutProblem

Interface Builder中问题的说明


9
尝试将UILabel放置在内容视图中,然后将标签的尾边设置为内容视图(普通UIView)。这个视频可能会对你有很大帮助:http://www.youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be - erdekhayser
1
视频很棒,但是对于我来说没有修复警告。 :( - Mr Rogers
非常感谢这个视频 - 我从中学到了很多东西(相当令人惊讶)!然而,当我将视频的知识与https://dev59.com/nmMk5IYBdhLWcg3wyw_H?rq=1结合起来时,我可以修复警告。剩下的问题是:如何使scrollView的contentView大小仅为必要大小? - Wirsing
除了顶部和尾部间距之外,还要添加前导空间和底部空间。 - Ting Yi Shih
我刚刚在Size Inspector中将Ambiguity->Never Verify设置为了“不检查歧义”,这样就可以正常工作而不需要将UIView添加为子视图(实际上,这对我造成了一些问题)。我通常会在代码中完成其余工作。目前还没有发现任何问题。 - Paweł Pela
显示剩余5条评论
34个回答

0

[在XCode 7.2和iOS 9.2中测试通过]

对我来说,抑制Storyboard的错误和警告的方法是将滚动视图和内容视图(在我的情况下是一个堆栈视图)的内在大小设置为占位符。这个设置可以在Storyboard的大小检查器中找到。它说-只有在Interface Builder中编辑时,设计时内在内容大小才会影响视图。在运行时,视图将没有这个内在内容大小。

所以,我想我们这样做不会出错。

注意:在Storyboard中,我将所有滚动视图的边缘都固定到父视图上,将所有堆栈视图的边缘都固定到滚动视图上。在我的代码中,我已经将translatesAutoresizingMaskIntoConstraints分别设置为false,既针对滚动视图,也针对堆栈视图。并且我没有提到内容大小。当堆栈视图动态增长时,Storyboard中设置的约束确保堆栈可滚动。

Storyboard的警告让我疯狂,我不想为了抑制警告而水平或垂直居中物品。


0

使用自动布局

将滚动视图放置在一个明确定义的视图内,然后将堆栈视图放置在滚动视图内

从滚动视图和堆栈视图到它们相关的父视图添加顶部、左侧、右侧、底部、中心X和中心Y约束

确保将约束链接从堆栈视图到正确的父视图(滚动视图),因为当前默认设置是添加“对齐顶部”约束而不是“顶部间距”约束。


-2

在滚动视图中的所有子视图都必须具有与滚动视图所有边缘相接触的约束条件,正如文档中所解释的那样,滚动视图的高度和宽度是由其子视图的尺寸自动计算的,这意味着您需要为宽度设置Trailing和Leading约束条件,为高度设置Top和Bottom约束条件。


-3

我认为现在只需要10秒钟的工作。我在XCode 7.3中观察到了它,并制作了一个视频。请点击这里查看:

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

你只需要将一个子视图添加到与 UIScrollView 相同的宽度和高度,然后选择 ViewController 并按下 Reset to suggested constraint。请查看视频以获得清晰的理解。
谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接