J'essaie de 'montrer' & 'cacher' une vue de collection en manipulant les contraintes par programmation.Swift - Modification par programme des contraintes
Mon application est écrite en code, aucun story-board ou @IBOutlets ne sont utilisés.
La première fois que j'appuie sur le bouton, la vue de collection apparaît correctement et comme prévu.
La deuxième fois que j'appuie sur le bouton, la vue de collection reste juste en place et ne «cache» pas.
Les instructions d'impression dans le code openMenu
confirment que chaque bloc de contraintes est appelé. c'est-à-dire: je reçois des messages de console pour 'ouvert' et 'fermé'.
Je n'ai aucun problème avec la création de la vue de collection, c'est simplement que la définition des contraintes par programmation ne ferme pas le menu.
Toute aide serait appréciée. Merci
Mon code est comme suit ...
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.isNavigationBarHidden = false
view.backgroundColor = .white
view.addSubview(bgImageView)
view.addSubview(myListCV)
}
lazy var myListCV: UICollectionView = {
let myListLayout = UICollectionViewFlowLayout()
myListLayout.itemSize = CGSize(width: 200, height: 40)
myListLayout.minimumLineSpacing = 1
myListLayout.sectionHeadersPinToVisibleBounds = true
let myListView = UICollectionView(frame: .zero, collectionViewLayout: myListLayout)
myListView.translatesAutoresizingMaskIntoConstraints = false
myListView.delegate = self
myListView.dataSource = self
myListView.bounces = false
myListView.alwaysBounceVertical = false
myListView.showsVerticalScrollIndicator = true
myListView.backgroundColor = UIColor(r: 203, g: 203, b: 203)
return myListView
}()
var menuShowing = false
func openMenu() {
if (menuShowing) {
print("closed")
myListCV.leftAnchor.constraint(equalTo: view.rightAnchor).isActive = true
myListCV.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true
myListCV.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
myListCV.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
} else {
print("open")
myListCV.leftAnchor.constraint(equalTo: view.rightAnchor, constant: -200).isActive = true
myListCV.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true
myListCV.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
myListCV.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
menuShowing = !menuShowing
}
Utilisez le débogueur View! – matt
Vous devriez être ** activer/désactiver ** les contraintes, et pas simplement mettre les choses comme 'isActive = true'. Considérons - la contrainte 'rightAnchor' est définie * deux fois *, en fonction de l'instruction' if'! Comment est-ce logique? Soit (a) groupez vos contraintes dans array et * les activez/les désactivez *, soit (b) déclarez * par nom de variable * les contraintes que vous souhaitez modifier et * ensuite * les modifiez dans votre instruction if. – dfd
@matt merci pour votre contribution. Si par "Utiliser le débogueur View!" vous voulez dire placer des points d'arrêt et passer par le code, je l'ai fait. Je vois que je mets deux contraintes d'ancrage à gauche, ce qui peut empêcher la fermeture de la vue de collection. Je croyais que la déclaration 'if' ne ferait que définir ce qui était demandé en fonction de la condition. Pouvez-vous fournir des commentaires qui pourraient m'aider à résoudre ce problème? – K1llarney