J'ai créé deux vues dans un superview, puis j'ai ajouté des contraintes entre les vues:
_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];
Maintenant, je veux changer la propriété du multiplicateur avec une animation, mais je ne peux pas comprendre comment changer la propriété du multiplicateur. (J'ai trouvé _coefficient dans la propriété privée dans le fichier d'en-tête NSLayoutConstraint.h, mais il est privé.)
Comment changer la propriété du multiplicateur?
Ma solution de contournement consiste à supprimer l'ancienne contrainte et à ajouter la nouvelle avec une valeur différente pour multipler
.
Réponses:
Si vous n'avez que deux ensembles de multiplicateurs qui doivent être appliqués, à partir d' iOS8 , vous pouvez ajouter les deux ensembles de contraintes et décider lequel doit être actif à tout moment:
Version Swift 5.0
la source
addConstraint(_:)
etremoveConstraint(_:)
sur la vue qui est l'ancêtre commun le plus proche des éléments gérés par cette contrainte".Voici une extension NSLayoutConstraint dans Swift qui facilite la définition d'un nouveau multiplicateur:
Dans Swift 3.0+
Utilisation de la démonstration:
la source
NSLayoutConstraint.deactivateConstraints([self])
doit être fait avant la créationnewConstraint
, sinon cela peut entraîner un avertissement: Impossible de satisfaire simultanément les contraintes . Est égalementnewConstraint.active = true
inutile puisqueNSLayoutConstraint.activateConstraints([newConstraint])
fait exactement la même chose.cloneWithMultiplier
pour rendre plus explicite qu'elle n'applique pas seulement des effets secondaires, mais renvoie plutôt une nouvelle contrainte0.0
vous ne pourrez plus le mettre à jour.le
multiplier
propriété est en lecture seule. Vous devez supprimer l'ancien NSLayoutConstraint et le remplacer par un nouveau pour le modifier.Cependant, puisque vous savez que vous voulez changer le multiplicateur, vous pouvez simplement changer la constante en la multipliant vous-même lorsque des modifications sont nécessaires, ce qui est souvent moins de code.
la source
View2.bottomY
la valeur actuelle de la contrainte pour calculer la nouvelle constante de la contrainte . C'est imparfait, puisqueView2.bottomY
l'ancienne valeur de la constante sera intégrée à la constante, vous devez donc abandonner le style déclaratif et mettre à jour manuellement la contrainte à tout momentView2.bottomY
. Dans ce cas, vous pouvez également effectuer une mise en page manuelle.Une fonction d'aide que j'utilise pour changer le multiplicateur d'une contrainte de disposition existante. Il crée et active une nouvelle contrainte et désactive l'ancienne.
Utilisation, changement du multiplicateur à 1,2:
la source
NSLayoutConstraint.deactivate
La fonction est iOS 8.0+ uniquement.Version Objective-C pour la réponse d'Andrew Schreiber
Créez la catégorie pour la classe NSLayoutConstraint et ajoutez la méthode dans le fichier .h comme ceci
Dans le fichier .m
Plus tard dans le ViewController, créez la prise pour la contrainte que vous souhaitez mettre à jour.
et mettez à jour le multiplicateur où vous le souhaitez, comme ci-dessous.
la source
active = true
la même manière que activate et provoque donc l'ajout d'une contrainte en double avant que la désactivation ne soit appelée, cela provoque une erreur de contraintes dans certains scénarios.Vous pouvez modifier la propriété "constante" à la place pour atteindre le même objectif avec un peu de maths. Supposons que votre multiplicateur par défaut sur la contrainte est 1.0f. Il s'agit de code Xamarin C # qui peut être facilement traduit en objective-c
la source
Comme dans d'autres réponses expliquées: vous devez supprimer la contrainte et en créer une nouvelle.
Vous pouvez éviter de renvoyer une nouvelle contrainte en créant une méthode statique pour
NSLayoutConstraint
withinout
parameter, qui vous permet de réaffecter la contrainte passéeExemple d'utilisation:
la source
AUCUN DES CODE CI-DESSUS N'A FONCTIONNÉ POUR MOI APRÈS AVOIR TENTÉ DE MODIFIER MON PROPRE CODE CE CODE Ce code fonctionne dans Xcode 10 et swift 4.2
la source
Oui, nous pouvons changer les valeurs de multiplicateur, il suffit de créer une extension de NSLayoutConstraint et de l'utiliser comme ->
la source
Changer en changeant la contrainte active dans le code comme suggéré par de nombreuses autres réponses n'a pas fonctionné pour moi. J'ai donc créé 2 contraintes, l'une installée et l'autre non, lier les deux au code, puis basculer en supprimant l'une et en ajoutant l'autre.
Par souci d'exhaustivité, pour lier la contrainte, faites glisser la contrainte vers le code en utilisant le bouton droit de la souris, comme tout autre élément graphique:
J'ai nommé une proportionIPad et l'autre proportionIPhone.
Ensuite, ajoutez le code suivant, à viewDidLoad
J'utilise xCode 10 et Swift 5.0
la source
Voici une réponse basée sur la réponse de @ Tianfu en C #. D'autres réponses qui nécessitent l'activation et la désactivation des contraintes n'ont pas fonctionné pour moi.
la source
Pour modifier la valeur du multiplicateur, suivez les étapes ci-dessous: 1. créez des points de vente pour la contrainte requise, par exemple someConstraint. 2. modifiez la valeur du multiplicateur comme someConstraint.constant * = 0.8 ou n'importe quelle valeur de multiplicateur.
c'est tout, codage heureux.
la source
On peut lire:
sur cette page de documentation . Cela ne veut-il pas dire qu'il faut pouvoir modifier le multiplicateur (puisqu'il s'agit d'un var)?
la source
var multiplier: CGFloat { get }
est la définition qui signifie qu'il n'a qu'un getter.