web-dev-qa-db-fra.com

Comment supprimer des contraintes par programmation ajoutées au storyboard?

J'ai googlé mais ne trouve pas de réponse. Donc j'ai besoin de demander. J'ai un écran d'accueil. Lorsque l'utilisateur est connecté, il affiche une vue comme ci-dessous enter image description here Maintenant, lorsque l'utilisateur est déconnecté et se rend sur la page d'accueil, il voit la disposition ci-dessus, mais sans la disposition encadrée au centre. Si je mets cette disposition masquée, elle affiche maintenant les informations suivantes. enter image description here

Je veux déplacer la troisième mise en page à un peu plus haut pour supprimer l'espace blanc ..

J'ai ajouté des contraintes en utilisant le storyboard. Maintenant, il faut supprimer les contraintes de la programmation et ajouter une contrainte qui définira la mise en page ci-dessous.

35
Dharmik

Comme @Henit l'a mentionné, vous pouvez également définir des contraintes pour IBOutlet.

Par exemple,

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

alors maintenant, vous pouvez supprimer cette contrainte comme ceci:

[myView removeConstraint: viewHeight];

Sinon, si vous souhaitez supprimer toutes/plusieurs contraintes liées à votre vue,

[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references
[myView removeConstraints: [myView constraints]]; //all constraints

Ensuite, vous pourrez ajouter vos nouvelles contraintes de la même manière en utilisant la méthode addConstraint ou addConstraints.

Pour plus de détails, consultez Apple Documentation ici.

J'espère que cela t'aides.

34
Mrunal

removeConstraints sera obsolète à l'avenir.

Vous pouvez utiliser ce qui suit comme alternative

viewHeight.active = NO;
24
Megamind

Pour développer la réponse de @ Megamind: vous pouvez utiliser la propriété active de NSLayoutConstraint. Configurez simplement deux contraintes différentes pour les deux cas et activez-en une seule en fonction du statut de connexion. Dans InterfaceBuilder, la propriété active est étrangement appelée Installed:

Login constraintRegister constraint

Ensuite, dans votre code, basculez entre les deux:

- (void)setupRegistrationView
{        
    _loadingIndicatorTopConstraintLogin.active = NO;
    _loadingIndicatorTopConstraintRegister.active = YES;
}

- (void)setupLoginView
{        
    _loadingIndicatorTopConstraintLogin.active = YES;
    _loadingIndicatorTopConstraintRegister.active = NO;
}

BTW, en utilisant le nouveau UIStackView peut fournir une solution plus élégante pour votre cas, mais c'est un autre sujet.

12
AXE

Prenez l'IBOutlet de la contrainte de hauteur que vous souhaitez masquer lorsque l'utilisateur se déconnecte.

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

Il y a une propriété constante dans NSLayoutConstraint classe. Vous devez le définir lorsque l'utilisateur se connecte/se déconnecte.

viewHeight.constant = isLoggedIn ? 30.0 : 0.0;

J'espère que cela t'aides..

11
Henit Nathwani

C’est très simple avec iOS 10+, vous pouvez simplement parcourir toutes les contraintes d’une vue et la désactiver. Si vous, par exemple Pour rechercher et supprimer la contrainte de hauteur d’une vue, vous pouvez effectuer les opérations suivantes:

for constraint in constraints {
    guard constraint.firstAnchor == heightAnchor else { continue }
    constraint.isActive = false
    break
}

ALTERNATIVE
C'est même un one-liner. Si vous êtes à l'intérieur de votre vue, vous pouvez simplement écrire:

constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false
8
blackjacx

Dans Swift 4

@IBOutlet weak var viewHeight: NSLayoutConstraint!
viewHeight.isActive = false    

Bonne codage :)

7
Ariven Nadar

Vous pouvez le faire d'une autre manière aussi. Ajoutez une contrainte d'espacement vertical entre la troisième mise en page et la première mise en page qui sera 30. Ensuite, ajoutez une référence à la contrainte dans le contrôleur.

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0

PS: Dans ce cas, vous ne devez pas ajouter de contrainte de hauteur pour la vue du milieu. Il suffit d’ajouter les quatre caractères de fin, de début, de haut (à la première mise en page) et de bas (à la troisième, mise en page).

2

Vous pouvez ajouter une contrainte de hauteur pour la vue à masquer. Et ajoutez une sortie NSlayoutHeightcontraint pour cette contrainte de hauteur dans votre fichier viewcontroller.h. Vous pouvez ensuite appeler cette sortie heightConstrain dans votre fichier viewcontroller.m où vous le souhaitez. Ajoutez ce code là où vous voulez cacher ceci UIview:

_heightconstrainOutlet.constant=0;

Cela fera que cette hauteur devienne zéro. Ainsi, votre vue de dessous couvrira également cette zone. Si votre vue inférieure avait une contrainte de hauteur et une contrainte d'espace au fond du conteneur? Il suffit d’enlever l’un d’eux en tant que votre besoin.

1
Thanveer Ahammed

J'ai eu un problème similaire avec une tableView qui avait une autre tableView dans une cellule, les contraintes de hauteur s'empilaient au fur et à mesure que la cellule était réutilisée. Pour résoudre cela, j'ai fait:

constraints.filter({$0.firstAnchor == heightAnchor }).forEach{ $0.isActive = false }
0
Tharak