代码之家  ›  专栏  ›  技术社区  ›  Alex

以编程方式布局UIScrollView,并将自动布局添加到其子视图中,但它不会滚动

  •  1
  • Alex  · 技术社区  · 7 年前

    import UIKit
    
    class ViewController: UIViewController {
    
        let scrollView: UIScrollView = {
            let sv = UIScrollView()
            sv.translatesAutoresizingMaskIntoConstraints = false
            sv.backgroundColor = .gray
            return sv
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            view.addSubview(scrollView)
    
            scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
            scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
            scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
            scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    
            let view1 = UIView()
            view1.backgroundColor = .red
    
            let view2 = UIView()
            view2.backgroundColor = .blue
    
            let view3 = UIView()
            view3.backgroundColor = .green
    
            let view4 = UIView()
            view4.backgroundColor = .purple
    
            let views = [view1, view2, view3, view4]
    
            for view in views {
                scrollView.addSubview(view)
                view.translatesAutoresizingMaskIntoConstraints = false
            }
    
            view1.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
            view1.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
            view1.heightAnchor.constraint(equalToConstant: 140).isActive = true
            view1.widthAnchor.constraint(equalToConstant: 140).isActive = true
    
            view2.topAnchor.constraint(equalTo: view1.bottomAnchor, constant: 100).isActive = true
            view2.leftAnchor.constraint(equalTo: view1.rightAnchor).isActive = true
            view2.heightAnchor.constraint(equalToConstant: 140).isActive = true
            view2.widthAnchor.constraint(equalToConstant: 140).isActive = true
    
            view3.topAnchor.constraint(equalTo: view2.bottomAnchor, constant: 50).isActive = true
            view3.leftAnchor.constraint(equalTo: view1.rightAnchor).isActive = true
            view3.heightAnchor.constraint(equalToConstant: 140).isActive = true
            view3.widthAnchor.constraint(equalToConstant: 140).isActive = true
    
            view4.topAnchor.constraint(equalTo: view3.bottomAnchor, constant: 20).isActive = true
            view4.leftAnchor.constraint(equalTo: view1.rightAnchor).isActive = true
            view4.heightAnchor.constraint(equalToConstant: 140).isActive = true
            view4.widthAnchor.constraint(equalToConstant: 140).isActive = true
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   drulang    7 年前

    在UIScrollViews中使用Autolayout时,必须将子视图固定到scrollview的顶部和底部,这样scrollview才能计算其内容大小。

    添加此行可以修复此问题:

    view4.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0).isActive = true