Comment modifier ou mettre à jour NSLayoutConstraint par programmation
J'ai mis en œuvre mise en page automatique par programmation en utilisant le Code :
- (void)addConstraintWithListNavigationViewController:(UIView *)listViewNavigation y:(CGFloat)y height:(CGFloat)height
{
//WIDTH_ListTableView = 0.4
//set x = 0;
NSLayoutConstraint *constraintToAnimate1 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeft
multiplier:0.00
constant:0];
[self.view addConstraint:constraintToAnimate1];
//set y = y;
NSLayoutConstraint *constraintToAnimate2 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:0.00
constant:y];
[self.view addConstraint:constraintToAnimate2];
//set Width = self.view.frame.size.width*0.4
NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:1-WIDTH_ListTableView
constant:0.0];
[self.view addConstraint:constraintToAnimate3];
//Set height = height
NSLayoutConstraint *constraintToAnimate4 = [NSLayoutConstraint constraintWithItem:listViewNavigation
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.00
constant:height];
[self.view addConstraint:constraintToAnimate4];
}
Et cela fonctionne parfaitement, mais à chaque fois cette ViewController reçoit un Notification, il sera exécuté:
[self.view layoutIfNeeded];
Mais je veux régler la largeur de listViewNavigation selon une variable booléenne connecté.
if(connected){
listViewNavigation.view.frame.size.width = 0.4 * self.view.frame.size.width;
}
else{
listViewNavigation.view.frame.size.width = 0.6 * self.view.frame.size.width;
}
Mais je ne sais pas comment mettre à jour le NSLayoutConstraint :
NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:PreView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:1 - WIDTH_ListTableView
constant:0.0];
[self.view addConstraint:constraintToAnimate3];
lorsque cette ViewController recevoir le notification.
OriginalL'auteur Nijat2018 | 2015-06-03
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez 2 options.
Option 1
Garder une propriété
Ensuite utiliser cette propriété pour
Lorsque vous voulez changer
Option 2
Définir un identificateur de constraintToAnimate3
Alors à la recherche pour obtenir la contrainte
Puis modifiez la constante comme le montre Option1
Mise à jour:
Si l'utilisation de la constante dans le code que je poste
De cette façon,vous devez mettre à jour constante.J'ai donc changer la contrainte de "multiplicateur:1,une constante:0.4 * l'auto.vue.cadre.taille.largeur",vous pouvez définir la constante de droit constant que vous le souhaitez
Le listViewNavigation.cadre.taille.la largeur est devenu trop grand. Si j'ai mis le multiplicateur = 0, alors c'est OK. Mais je me souviens d'Apple ne permet pas de régler le multiplicateur = 0;
Donc, je pense que si nous mettons de "multiplicateur = 1.0", nous devrions mettre en de la "constante = - 0.4*l'auto.vue.cadre.taille.largeur"
Oui,je n'ai pas d'informations détaillées au sujet de ce que votre point de vue exactement la taille du code que vous publiez. C'est juste une relation de largeur. Vous pouvez décider de ce qu'il est. L'aperçu.largeur = auto.vue.largeur * multiplicateur + constante. Je pense que vous pouvez comprendre
OriginalL'auteur Leo
OK, je figure.
OriginalL'auteur Nijat2018
Il est essentiel que vous ne l'ajoutez pas les contraintes de votre point de vue, mais que vous aussi vous vous en souvenez.
Il est plus facile de modifier une contrainte si vous avez seulement besoin de changer sa constante, la constante est la seule partie d'une contrainte qui peut être changé par la suite à plusieurs reprises. Pour ce faire, vous avez besoin de stocker de la contrainte sur son propre.
Sinon, vous devez supprimer les anciennes contraintes et d'en ajouter de nouvelles. Comme vous avez plus d'une contrainte, stocker des tableaux avec des ensembles de contraintes qui peuvent avoir besoin d'être remplacé, puis mise à jour de l'ensemble de la baie. Vous pouvez également utiliser le activateConstraints et deactivateConstraints méthodes.
OriginalL'auteur gnasher729