无法使动态滚动视图根据其内容的大小工作。

8 浏览
0 Comments

无法使动态滚动视图根据其内容的大小工作。

我在使用滚动视图时遇到了一个问题,无法动态调整大小并滚动以适应所有内容。我以编程方式处理它,因为我觉得在处理自动布局时最容易使用。无论如何,我找到的在线解决方案似乎都不起作用,我最接近的一次尝试是这样的:contentView.heightAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.heightAnchor).isActive = true 将上下文视图的高度锚点设置为滚动视图的框架布局指南,这样我就可以滚动了,但仍然无法到达底部。我觉得我一定是忽略了什么,但是我找不到解决办法。以下是我的代码。也抱歉下面的显示方式,我无法将其全部放入框中。

编辑:在发布之前,我尝试将内容视图嵌入堆栈视图,所以它在那里,但是我尝试过没有堆栈,但仍然不起作用。

编辑2:找到了解决方法并修复了代码的显示方式。

import UIKit
import Charts
class ViewController: UIViewController, UIScrollViewDelegate, ChartViewDelegate {
    //代码省略...
}

0
0 Comments

从上述内容中提取出问题的原因和解决方法:

问题原因:动态滚动视图不能自适应其内容的大小。

解决方法:给底部元素添加底部约束,并在约束设置结束时添加一行代码,将底部元素的底部约束设置为与内容视图的底部约束相等。然后删除两个扩展和viewDidLayoutSubviews()方法,将scrollView.delegate = self放在viewDidLoad()方法中。通过添加底部约束,可以实现滚动视图可以滚动到内容的底部。

最后给出了两个示例图片,一个是没有添加底部约束的情况下不能滚动的截图,另一个是添加了底部约束后可以滚动到内容底部的截图。

0
0 Comments

问题的原因是因为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

0