2017-08-24 2 views
-1

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 
} 
+0

Utilisez le débogueur View! – matt

+0

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

+0

@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

Répondre

1

Le problème avec votre code ci-dessus est que vous définissez en permanence des contraintes à chaque fois que l'utilisateur ouvre ou ferme la la section, donc en fonction du nombre de fois l'utilisateur fait cela, vous allez vous retrouver avec des centaines de contraintes qui ne sont tout simplement pas nécessaires. Ce que vous devez faire est de définir les contraintes pour l'état par défaut, je suppose être fermé dans cette instance, et stocker la contrainte que vous souhaitez modifier dans une propriété. Vous pouvez ensuite simplement ajuster la constante de cette contrainte pour afficher/masquer votre menu.

par exemple.

private var myListCVLeftConstraint: NSLayoutConstraint? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    navigationController?.isNavigationBarHidden = false 

    view.backgroundColor = .white 

    view.addSubview(bgImageView) 

    self.configMyListCV() 
} 

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 

private func configMyListCV() -> Void { 

    view.addSubview(myListCV) 

    self.myListCV.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true 
    self.myListCV.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
    self.myListCV.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 

    self.myListCVLeftConstraint = myListCV.leftAnchor.constraint(equalTo: view.rightAnchor) 
    self.myListCVLeftConstraint.isActive = true 
} 

func openMenu() { 

    if (menuShowing) { 

     self.myListCVLeftConstraint?.constant = 0.0 

    } else { 

     self.myListCVLeftConstraint?.constant = -200.0 

    } 

    menuShowing = !menuShowing 
} 

Cela fonctionnera bien pour ce cas d'utilisateur simple; Cependant, si vous faites quelque chose de plus en profondeur dans le futur, je suggérerais de définir plusieurs contraintes sur la vue et de simplement désactiver/activer celles requises.

+0

Merci beaucoup pour votre contribution.Cela fonctionne comme un charme et très apprécié. Je prends note de vos conseils concernant l'activation/désactivation des contraintes si jamais je veux faire quelque chose de plus complexe. – K1llarney