2017-08-29 1 views
-1

J'essaie de supprimer les contraintes. Je veux des contraintes différentes sur le portrait et le paysage. Si je change l'orientation en Portrait, j'appelle la fonction setupConstrainsInPortrait et inversement. J'ai deux fonctions.Supprimer les contraintes iOS

Cette fonction permet de configurer le mode Portrait.

func setupConstrainsInPortrait() { 

    view.addSubview(myView) 

    myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true 
    myView.heightAnchor.constraint(equalToConstant: 300).isActive = true 
    myView.widthAnchor.constraint(equalToConstant: view.frame.size.width).isActive = true 

    view.addSubview(switchKmM) 

    switchKmM.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    switchKmM.topAnchor.constraint(equalTo: myView.bottomAnchor, constant: 10).isActive = true 
    switchKmM.heightAnchor.constraint(equalToConstant: 50).isActive = true 
    switchKmM.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

    view.addSubview(speedLbl) 

    speedLbl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    speedLbl.topAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true 
    speedLbl.heightAnchor.constraint(equalToConstant: 50).isActive = true 
    speedLbl.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

} 

Cette fonction permet de configurer le mode paysage.

func setupConstrainsInLandScape() { 
    view.addSubview(myView) 

    myView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true 
    myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
    myView.heightAnchor.constraint(equalToConstant: 300).isActive = true 
    myView.widthAnchor.constraint(equalToConstant: 150).isActive = true 

    view.addSubview(switchKmM) 

    switchKmM.leftAnchor.constraint(equalTo: myView.rightAnchor, constant: 30).isActive = true 
    switchKmM.topAnchor.constraint(equalTo: view.topAnchor, constant: 30).isActive = true 
    switchKmM.heightAnchor.constraint(equalToConstant: 50).isActive = true 
    switchKmM.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
} 

-je utiliser ces fonctions dans viewWillTransition

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    if UIDevice.current.orientation.isLandscape { 
     print("landscape!") 
     view.backgroundColor = .green 
     setupConstrainsInLandScape() 
     self.viewWillLayoutSubviews() 


    } 
    else { 
     print("portrét") 
     view.backgroundColor = .white 
     setupConstrainsInPortrait() 
     self.viewWillLayoutSubviews() 

    } 
    super.viewWillTransition(to: size, with: coordinator) 
} 

Le problème est que les contraintes (de la fonction portrait) en mode paysage ne sont pas supprimés

J'espère que quelqu'un peut me aider. .. Merci

+0

Quelle est la question/le problème? Donnez les résultats souhaités par rapport aux résultats réels. – matt

+0

Le problème est, que les contraintes (de la fonction portrait) en mode paysage ne sont pas supprimées –

+0

"les contraintes (de la fonction portrait) en mode paysage ne sont pas supprimées" Pas de surprise là-bas. Je ne vois aucun code qui les supprimerait. Tout ce que vous faites est de dire 'isActive = true'. Jamais une fois vous ne dites 'isActive = false'. Donc, vous continuez à ajouter et à ajouter des contraintes sans jamais en supprimer. Qu'attendez-vous, dans ce cas? – matt

Répondre

3

Vous ne faites pas assez de travail. Vous devez conserver des références à toutes les contraintes que vous activez, afin de pouvoir les désactiver ultérieurement. Par exemple, vous dites:

myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true 
myView.heightAnchor.constraint(equalToConstant: 300).isActive = true 
myView.widthAnchor.constraint(equalToConstant: view.frame.size.width).isActive = true 

Au lieu de cela, vous avez besoin de dire quelque chose comme

self.myConstraints1 = [ 
    myView.centerXAnchor.constraint(equalTo: view.centerXAnchor), 
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50), 
    myView.heightAnchor.constraint(equalToConstant: 300), 
    myView.widthAnchor.constraint(equalToConstant: view.frame.size.width), 
] 

maintenant activer toutes ces contraintes. Procéder de la même manière tout au long. Ainsi, lorsque vient le temps de désactiver des contraintes parce que l'orientation change, vous avez des références à ces contraintes et vous pouvez le faire.

+0

ok, mais où puis-je activer dans self.myConstraints1? –

+0

Euh, mec. Que diriez-vous de 'NSLayoutConstraint.activate (self.myConstraints1)'? La science à peine fusée. – matt

+0

Rien à voir avec "swift". Si vous êtes sérieux au sujet d'un problème, vous pouvez au moins consulter la documentation de base: https://developer.apple.com/documentation/uikit/nslayoutconstraint – matt

-1

Vous pouvez supprimer vos contraintes en utilisant:

myView.constraints.removeAll() 

Avant de définir les nouveaux.

+0

Regardez la question avant de voter. Il demande comment supprimer les contraintes. J'ai répondu comment. – GIJOW

+0

Je l'ai fait. Il n'a même pas déclaré son résultat ou sa tentative de résultat. Il a demandé comment enlever et j'ai répondu. – GIJOW

+0

La propriété constraints sur une vue est immuable - vous ne pouvez pas utiliser la fonction mutable 'removeAll()'. Je pense que ce que vous vouliez dire était 'myView.removeConstraints (myView.constraints)' – swillsea