[为改善较小设备的用户界面,当UIScrollView
contentSize.height
大于bounds.height
时(我称此为溢出),我想调整UI。
我的问题是:我发现视图的布局在屏幕上(在viewDidAppear(:)
中)后与上一个viewDidLayoutSubviews()
中的视图不同(可以多次调用)。为了确定scrollView
是否溢出,我们需要同时知道scrollView.bounds
和scrollView.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