2017-10-01 3 views
0

J'essaie de créer un simple défilement horizontal entre deux contrôleurs de vue positionnés côte à côte par programmation en utilisant des contraintes. Ce que j'ai ici semble fonctionner mais tout ce que j'ai lu dit que je n'ai pas besoin de configurer la taille du contentSize si les contraintes sont correctement définies - autolayout le fera pour moi. Mais quand j'enlève scrollView.contentSize = CGSize(width: view.bounds.width * 2, height: view.bounds.height) de viewWillLayoutSubviews, il ne défile pas. Où est-ce que je me suis trompé?Méthode correcte pour définir UIScrollView avec des contraintes par programme?

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

cela est faux "contentView.trailingAnchor.constraint (equalTo: view.trailingAnchor) .isActive = true", en réglant le contentView trailingAnchor pour afficher trailingAnchor, vous définissez la largeur du contenu est la même que la largeur de la vue. Aussi, toutes les contraintes de mise en page pour contentView doivent également être créées par rapport à scrollView. –

Répondre

1

cela devrait fonctionner

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

Tout ce que j'ai lu a explicitement indiqué de ne pas ajouter de vues directement à la vue défilement sauf pour la vue de contenu, qui devrait être une vue appelée 'contentView'. – sconewolf

+0

cela n'est pas toujours vrai, contentView est utile lorsque la mise en page est complexe et que nous voulons modifier la disposition existante dans UIScrollView. Mais dans ce cas, l'interface utilisateur est assez simple, contentView n'est pas nécessaire. –