为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?

Posted

技术标签:

【中文标题】为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?【英文标题】:Why is UIScrollView contentSize ignored in IB but works when I set it in my viewDidAppear method?为什么 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效? 【发布时间】:2014-09-28 02:00:12 【问题描述】:

我已经为此苦苦挣扎了一段时间,并心想我会让我的 scrollView 成为一个出口并尝试在 viewDidLoad 中设置内容大小,但这没有用。

然后我尝试了 viewWillAppear 并且再次没有运气。没有任何希望,我想我不妨试试 viewDidAppear,它奏效了。

在此之前,scrollView 只会轻微滚动,并且没有考虑到我在 IB 中的 contentSize。

IB 中是否有阻止这种情况发生的设置?

【问题讨论】:

正如 rob 解释的那样,这基本上是因为 ORDER 事情发生了。 【参考方案1】:

我假设您为情节提要(或 xib)启用了自动布局。

自动布局根据滚动视图及其子视图之间的约束设置滚动视图的contentSize。我相信这发生在滚动视图的layoutSubviews 方法中。

方法按以下顺序调用:

view controller's viewDidLoad
view controller's viewWillAppear:
view controller's viewWillLayoutSubviews
each view's layoutSubviews, from the root view down
view controller's viewDidLayoutSubviews
view controller's viewDidAppear:

当您尝试在viewDidLoadviewWillAppear: 中设置contentSize 时,它不起作用,因为滚动视图的layoutSubviews 稍后覆盖了它。当你在viewDidAppear: 中设置它时,你会覆盖滚动视图所做的事情。

处理这个问题的正确方法是在滚动视图和它的子视图之间创建约束。如果你想让滚动视图垂直滚动,你需要在它的上边缘和一个孩子之间,以及它的下边缘和一个孩子之间有约束,并且在孩子之间有足够的约束来确定整体的内容高度。

你可以在Technical Note TN2154: UIScrollView And Autolayout找到苹果的官方文档。

您可能还会发现this video 很有帮助。

【讨论】:

我做对了。但是我的限制被忽略了。我有 0 个黄色警告。然后我决定第二次设置内容大小,而是以编程方式设置,然后一切正常。

以上是关于为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥程序背景会减慢 UIScrollView?

为啥显示键盘时 UIScrollView 不滚动?

为啥 uiscrollview 不显示 contentOffset 更改?

为啥 View Controller 在 UIScrollView 上方滚动?

为啥我在 UIScrollView 中的 UIView 不滚动?

为啥滚动 UITableView 比滚动 UIScrollView 响应更快?