UIScrollView` bounds`在viewDidAppear`中与上一个`viewDidLayoutSubviews`不同>]

问题描述 投票:0回答:1

[为改善较小设备的用户界面,当UIScrollView contentSize.height大于bounds.height时(我称此为溢出),我想调整UI。

我的问题是:我发现视图的布局在屏幕上(在viewDidAppear(:)中)后与上一个viewDidLayoutSubviews()中的视图不同(可以多次调用)。为了确定scrollView是否溢出,我们需要同时知道scrollView.boundsscrollView.contentSize。我认为应该在viewDidLayoutSubviews()的上次调用中确定。

下面的例子是我的情况。它正在运行xib内置的接口,并且也在那里设置了scrollView。请注意,没有隐藏/显示视图来干扰布局值,只需贯穿其中即可。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    printOverflow(type: #function)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    printOverflow(type: #function)
}

private func printOverflow(type: String) {
    let isOverflowY = scrollView.contentSize.height > scrollView.bounds.height
    debugPrint("[Overflow] \(type) \(isOverflowY ? "Overflow" : "Fits")")
}

// After running prints:
// "[Overflow] viewDidLayoutSubviews() Fits"
// "[Overflow] viewDidAppear(_:) Overflow"

我的问题是:为什么不能在最后一个viewDidLayoutSubviews()中获得子视图的最终布局?

我还尝试在view.layoutIfNeeded()中添加一个viewWillAppear(:),的确确实触发了另一个viewDidLayoutSubviews(),但是bounds属性与viewDidAppear(:)中的属性[[still

不同(尽管实际上现在打印“溢出”) 为了改进较小设备的UI,当UIScrollView contentSize.height大于其bounds.height(我称这为溢出)时,我想调整UI。我的问题是:我是...
ios swift uiview uiviewcontroller uiscrollview
1个回答
0
投票
摘自Apple的docs(斜体字是我的::
© www.soinside.com 2019 - 2024. All rights reserved.