在Swift中以编程方式添加时,UIScrollView根本不滚动?

时间:2017-02-17 06:41:36

标签: ios swift uiscrollview

所以,我已经查看了几乎所有Stackoverflow对这个特定问题的答案,甚至查看了教程,据说教你如何使用滚动视图,但它似乎不适用于我的项目..

到目前为止,我所知道的是,为了让Scroll View正常工作,您首先需要为其提供内容大小。这决定了可滚动高度等。

我提供了一些代码,让您更好地了解我如何将所述项添加到我的scrollview中。如果有什么我做错了或有更好的方法去做这个请告诉我,我仍然是Swift和iOS开发的新手,在我看来感觉就像我正确地做到了。< / p>

我正在采取的步骤

  1. 创建我想要显示的项目(输入字段,图像视图等)。
  2. 将所述项添加到viewcontroller的视图中。 (view.addsubview(等))
  3. 创建scrollView并将其约束设置为与屏幕/视图相同
  4. 将我们的视图与其中的所有项目添加到所述滚动视图
  5. 放松,一切都应该完美无缺?????
  6. 这是我的代码,我知道它可能很冗长,但我认为可能需要这样才能理解我的问题的范围

    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
    

4 个答案:

答案 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容器底部的后面。