无法使动态滚动视图根据其内容的大小工作。
无法使动态滚动视图根据其内容的大小工作。
我在使用滚动视图时遇到了一个问题,无法动态调整大小并滚动以适应所有内容。我以编程方式处理它,因为我觉得在处理自动布局时最容易使用。无论如何,我找到的在线解决方案似乎都不起作用,我最接近的一次尝试是这样的:contentView.heightAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.heightAnchor).isActive = true
将上下文视图的高度锚点设置为滚动视图的框架布局指南,这样我就可以滚动了,但仍然无法到达底部。我觉得我一定是忽略了什么,但是我找不到解决办法。以下是我的代码。也抱歉下面的显示方式,我无法将其全部放入框中。
编辑:在发布之前,我尝试将内容视图嵌入堆栈视图,所以它在那里,但是我尝试过没有堆栈,但仍然不起作用。
编辑2:找到了解决方法并修复了代码的显示方式。
import UIKit import Charts class ViewController: UIViewController, UIScrollViewDelegate, ChartViewDelegate { //代码省略... }
问题的原因是因为UIScrollView只有一个subview,而这个subview是一个容器视图,包含了所有的UI组件。不确定为什么容器视图没有随着其subviews的增加而自动增长。解决方法是创建一个UIScrollView和UIView的扩展,使用一个函数对subviews按照每个subview的maxY进行排序,然后调整content view的大小和高度。同时,在viewDidLayoutSubviews()方法中,需要添加self.view.layoutIfNeeded()这一行代码。以下是解决方法的具体实现:
扩展:
extension UIScrollView {
func updateContentView() {
contentSize.height = subviews.sorted(by: { $0.frame.maxY < $1.frame.maxY }).last?.frame.maxY ?? contentSize.height
}
}
extension UIView {
func updateHeightToFitContent() {
frame.size.height = subviews.sorted(by: { $0.frame.maxY < $1.frame.maxY }).last?.frame.maxY ?? frame.size.height
}
}
viewDidLayoutSubviews()方法:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.delegate = self
self.view.layoutIfNeeded() //MAKE SURE YOU ADD THIS IT'S NEEDED
contentView.updateHeightToFitContent()
scrollView.updateContentView()
}
参考链接:link