为啥 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:
当您尝试在viewDidLoad
和viewWillAppear:
中设置contentSize
时,它不起作用,因为滚动视图的layoutSubviews
稍后覆盖了它。当你在viewDidAppear:
中设置它时,你会覆盖滚动视图所做的事情。
处理这个问题的正确方法是在滚动视图和它的子视图之间创建约束。如果你想让滚动视图垂直滚动,你需要在它的上边缘和一个孩子之间,以及它的下边缘和一个孩子之间有约束,并且在孩子之间有足够的约束来确定整体的内容高度。
你可以在Technical Note TN2154: UIScrollView And Autolayout找到苹果的官方文档。
您可能还会发现this video 很有帮助。
【讨论】:
我做对了。但是我的限制被忽略了。我有 0 个黄色警告。然后我决定第二次设置内容大小,而是以编程方式设置,然后一切正常。以上是关于为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 uiscrollview 不显示 contentOffset 更改?
为啥 View Controller 在 UIScrollView 上方滚动?