所以,我已经查看了几乎所有Stackoverflow对这个特定问题的答案,甚至查看了教程,据说教你如何使用滚动视图,但它似乎不适用于我的项目..
到目前为止,我所知道的是,为了让Scroll View正常工作,您首先需要为其提供内容大小。这决定了可滚动高度等。
我提供了一些代码,让您更好地了解我如何将所述项添加到我的scrollview中。如果有什么我做错了或有更好的方法去做这个请告诉我,我仍然是Swift和iOS开发的新手,在我看来感觉就像我正确地做到了。< / p>
我正在采取的步骤
这是我的代码,我知道它可能很冗长,但我认为可能需要这样才能理解我的问题的范围
class JobRegistrationController: UIViewController {
// ... Omitted for clarity
lazy var scrollView: UIScrollView = {
let view = UIScrollView(frame: UIScreen.main.bounds)
view.backgroundColor = .red
view.contentSize = CGSize(width: self.view.bounds.width, height: self.view.bounds.height * 2)
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
//... Omitted for clarity
let scrollContentView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
// Need so that view controller is not behind nav controller
self.edgesForExtendedLayout = []
view.addSubview(scrollView)
scrollView.addSubview(scrollContentView)
scrollContentView.addSubview(jobTypeField)
scrollContentView.addSubview(jobTypeDividerLine)
// x, y, width and height constraints
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
scrollView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
// x, y, width and height constraints
scrollContentView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
scrollContentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
scrollContentView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
scrollContentView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
// x, y, width and height constraints
jobTypeField.leftAnchor.constraint(equalTo: scrollContentView.leftAnchor, constant: 20).isActive = true
jobTypeField.topAnchor.constraint(equalTo: scrollContentView.topAnchor).isActive = true
jobTypeField.rightAnchor.constraint(equalTo: scrollContentView.rightAnchor, constant: -8).isActive = true
jobTypeField.heightAnchor.constraint(equalToConstant: 30).isActive = true
// x, y, width and height constraints
jobTypeDividerLine.leftAnchor.constraint(equalTo: scrollContentView.leftAnchor, constant: 20).isActive = true
jobTypeDividerLine.topAnchor.constraint(equalTo: jobTypeField.bottomAnchor).isActive = true
jobTypeDividerLine.rightAnchor.constraint(equalTo: scrollContentView.rightAnchor).isActive = true
jobTypeDividerLine.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
答案 0 :(得分:2)
在班级中使用此方法
override func viewDidLayoutSubviews()
{
scrollView.delegate = self
scrollView.contentSize = CGSize(width:self.view.frame.size.width, height: 1000) // set height according you
}
答案 1 :(得分:2)
view.contentSize = CGSize(width: self.view.bounds.width, height: self.view.bounds.height * 2)
尝试访问控制台后,应尝试在控制台中记录contentSize
。如果在此时调用self.view.bounds时,我不确定你是否在设置正确的contentSize
。因为self.view框架和边界需要花费时间来计算。
尝试在后设置{/ 1>} ,然后根据实际的总内容大小为其添加实际内容。
编辑:
在contentSize
内添加一个UIView
,并将约束设置为排在上下方的前导,并将子视图添加到其中。另外,在scrollView上将相同的约束设置为superView top-bottom-leading-trailing。
答案 2 :(得分:0)
我相信下面的代码行就是问题
scrollContentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
您应该将内容视图设置为视图顶部,而应将其设置为滚动视图顶部。
我刚刚将一个第一个视图的topAnchor设置为scrollView的safeAreaLayoutGuide.topAnchor
,就解决了一个类似的问题。一切布局正确,但约束不显示,因此scrollView的全部内容均未移动。
答案 3 :(得分:0)
问题是您不知道内容底部在哪里。换句话说,您需要一些底层约束。
如果您使用...
scrollContentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
...您还需要添加一个约束,以将至少一个视图绑定到UIScrollView的底部,例如:
scrollContentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
...,然后还将scrollContentView中的最后一个视图绑定到其bottomAnchor。
jobTypeDividerLine.bottomAnchor.constraint(equalTo: scrollContentView.bottomAnchor).isActive = true
这肯定会解决您的问题。因为这样,整个约束序列都是从上到下链接的。
最重要的是,UIScrollView不够聪明,无法以各种可能的方式确定自己的底部。这是一种懒惰。如果您没有告诉他足够多的信息,它就不会简单地滚动,而很显然您的内容会消失在UIScrollView容器底部的后面。