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
}
}
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. –