2017-10-01 14 views
0

제약 조건을 사용하여 프로그래밍 방식으로 나란히 배치 된 두 개의보기 컨트롤러간에 간단한 가로 스크롤을 만들려고합니다. 내가 여기있는 것은 작동하는 것처럼 보이지만 내가 읽은 모든 것은 제약 조건이 올바르게 설정되면 contentSize의 크기를 구성 할 필요가 없다고 말합니다. autolayout이 나를 대신 할 것입니다. 그러나 scrollView.contentSize = CGSize(width: view.bounds.width * 2, height: view.bounds.height)viewWillLayoutSubviews에서 제거하면 스크롤되지 않습니다. 나는 어디로 잘못 갔는가? 당신이 설정되어있는 contentView trailingAnchor이 trailingAnchor을 볼 수 설정, "(view.trailingAnchor EqualTo가) .isActive = 사실 contentView.trailingAnchor.constraint"프로그래밍 방식으로 제약 조건이있는 UIScrollView를 올바르게 설정하는 방법은 무엇입니까?

class ViewController0: UIViewController { 


    let scrollView = UIScrollView() 
    let contentView = UIView() 
    let page1 = ViewController1() 
    let page2 = ViewController2() 


    override func loadView() { 

     setView() 
     addScrollView() 
     fillScrollView() 

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 


    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     scrollView.contentSize = CGSize(width: view.bounds.width * 2, height: view.bounds.height) 

    } 


    func setView() { 

     view = UIView() 
     view.frame = UIScreen.main.bounds 
     view.backgroundColor = UIColor.blue 

    } 


    func addScrollView() { 

     scrollView.bounces = false 
     scrollView.isPagingEnabled = true 
     scrollView.backgroundColor = UIColor.brown 
     scrollView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(scrollView) 

     scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
     scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
     scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
     scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 

     contentView.backgroundColor = UIColor.green 
     contentView.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.addSubview(contentView) 

     contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true 
     contentView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true 
     contentView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 1).isActive = true 
     contentView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2).isActive = true 

    } 


    func fillScrollView() { 

     addChildViewController(page1) 
     page1.didMove(toParentViewController: self) 
     page1.view.translatesAutoresizingMaskIntoConstraints = false 
     contentView.addSubview(page1.view) 
     page1.view.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true 
     page1.view.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true 
     page1.view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true 
     page1.view.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true 

     addChildViewController(page2) 
     page2.didMove(toParentViewController: self) 
     page2.view.translatesAutoresizingMaskIntoConstraints = false 
     contentView.addSubview(page2.view) 
     page2.view.leadingAnchor.constraint(equalTo: page1.view.trailingAnchor).isActive = true 
     page2.view.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true 
     page2.view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true 
     page2.view.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true 

    } 


} 
+0

작동합니다 뷰의 폭과 같은 contentView 폭 또한 scrollView와 관련하여 contentView의 모든 레이아웃 제약 조건을 생성해야합니다. –

답변

1

이이 잘못

class ViewController0: UIViewController { 

    let scrollView = UIScrollView() 
    let page1 = ViewController1() 
    let page2 = ViewController1() 

    override func loadView() { 
     setView() 
     addScrollView() 
     setupPage() 
    } 

    func setView() { 

     view = UIView() 
     view.frame = UIScreen.main.bounds 
     view.backgroundColor = UIColor.blue 

    } 

    func addScrollView() { 

     scrollView.backgroundColor = UIColor.brown 
     scrollView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(scrollView) 
     scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
     scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
     scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
     scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
    } 

    func setupPage() { 
     page1.view.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.addSubview(page1.view) 
     addChildViewController(page1) 
     page1.didMove(toParentViewController: self) 

     page2.view.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.addSubview(page2.view) 
     addChildViewController(page2) 
     page2.didMove(toParentViewController: self) 

     let views: [String: UIView] = ["view": view, "page1": page1.view, "page2": page2.view] 
     let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[page1(==view)]|", options: [], metrics: nil, views: views) 
     let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|[page1(==view)][page2(==view)]|", options: [.alignAllTop, .alignAllBottom], metrics: nil, views: views) 

     NSLayoutConstraint.activate(verticalConstraints + horizontalConstraints) 
    } 

} 
+0

내가 읽은 모든 것은 'contentView'라는 뷰인 컨텐트 뷰를 제외하고는 스크롤 뷰에 직접 뷰를 직접 추가하지 않도록 명시 적으로 명시했다. – sconewolf

+0

항상 사실은 아니지만 contentView는 레이아웃이 복잡하고 UIScrollView 내부의 기존 레이아웃을 수정하려는 경우에 유용합니다. 그러나이 경우 UI는 매우 간단하므로 contentView가 필요하지 않습니다. –