Ich habe zwei Ansichten in einer Übersicht erstellt und dann Einschränkungen zwischen den Ansichten hinzugefügt:
_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];
Jetzt möchte ich die Multiplikatoreigenschaft mit Animation ändern, aber ich kann nicht herausfinden, wie die Multiplikatoreigenschaft geändert werden kann. (Ich fand _koeffizient in Privateigentum in der Header-Datei NSLayoutConstraint.h, aber es ist privat.)
Wie ändere ich die Multiplikatoreigenschaft?
Meine Problemumgehung besteht darin, die alte Einschränkung zu entfernen und die neue mit einem anderen Wert für hinzuzufügen multipler
.
ios
iphone
objective-c
nslayoutconstraint
Bimawa
quelle
quelle
Antworten:
Wenn Sie nur zwei Sätze von Multiplikatoren haben, die angewendet werden müssen, können Sie ab iOS8 beide Sätze von Einschränkungen hinzufügen und entscheiden, welche jederzeit aktiv sein sollen:
Swift 5.0 Version
quelle
addConstraint(_:)
undremoveConstraint(_:)
in der Ansicht, die der nächste gemeinsame Vorfahr der von dieser Einschränkung verwalteten Elemente ist".Hier ist eine NSLayoutConstraint-Erweiterung in Swift, die das Festlegen eines neuen Multiplikators ziemlich einfach macht:
In Swift 3.0+
Demo-Nutzung:
quelle
NSLayoutConstraint.deactivateConstraints([self])
sollte vor dem Erstellen durchgeführt werdennewConstraint
, da dies sonst zu einer Warnung führen kann: Einschränkungen können nicht gleichzeitig erfüllt werden . AuchnewConstraint.active = true
ist unnötig, daNSLayoutConstraint.activateConstraints([newConstraint])
genau das gleiche tut.cloneWithMultiplier
, um es deutlicher zu machen, dass sie nicht nur Nebenwirkungen anwendet, sondern eine neue Einschränkung zurückgibt0.0
nicht erneut aktualisieren können , wenn Sie ihn einstellen .Die
multiplier
Eigenschaft ist schreibgeschützt. Sie müssen die alte NSLayoutConstraint entfernen und durch eine neue ersetzen, um sie zu ändern.Da Sie jedoch wissen, dass Sie den Multiplikator ändern möchten, können Sie die Konstante einfach ändern, indem Sie sie selbst multiplizieren, wenn Änderungen erforderlich sind, bei denen es sich häufig um weniger Code handelt.
quelle
View2.bottomY
den aktuellen Wert, um die neue Konstante der Einschränkung zu berechnen . Das ist fehlerhaft, daView2.bottomY
der alte Wert in der Konstante gebacken wird. Sie müssen also den deklarativen Stil aufgeben und die Einschränkung bei jederView2.bottomY
Änderung manuell aktualisieren . In diesem Fall können Sie auch ein manuelles Layout erstellen.Eine Hilfsfunktion, mit der ich den Multiplikator einer vorhandenen Layoutbeschränkung ändere . Es erstellt und aktiviert eine neue Einschränkung und deaktiviert die alte.
Verwendung, Änderung des Multiplikators auf 1,2:
quelle
NSLayoutConstraint.deactivate
Funktion ist nur iOS 8.0+.Objective-C-Version für Andrew Schreiber Antwort
Erstellen Sie die Kategorie für die NSLayoutConstraint-Klasse und fügen Sie die Methode wie folgt in die .h-Datei ein
In der .m-Datei
Erstellen Sie später im ViewController den Ausgang für die Einschränkung, die Sie aktualisieren möchten.
und aktualisieren Sie den Multiplikator, wo immer Sie möchten.
quelle
active = true
wie Aktivieren verschoben und bewirkt daher, dass eine doppelte Einschränkung hinzugefügt wird, bevor Deaktivieren aufgerufen wird. Dies führt in einigen Szenarien zu einem Einschränkungsfehler.Sie können stattdessen die Eigenschaft "Konstante" ändern, um dasselbe Ziel mit ein wenig Mathematik zu erreichen. Angenommen, Ihr Standardmultiplikator für die Einschränkung ist 1.0f. Dies ist Xamarin C # -Code, der leicht in Objective-C übersetzt werden kann
quelle
Wie in anderen Antworten erläutert: Sie müssen die Einschränkung entfernen und eine neue erstellen.
Sie können die Rückgabe einer neuen Einschränkung vermeiden, indem Sie eine statische Methode für
NSLayoutConstraint
mitinout
Parameter erstellen, mit der Sie die übergebene Einschränkung neu zuweisen könnenAnwendungsbeispiel:
quelle
Keiner der oben genannten Codes hat für mich funktioniert, nachdem versucht wurde, meinen eigenen Code zu ändern. Dieser Code funktioniert in Xcode 10 und schnell 4.2
quelle
Ja, wir können Multiplikatorwerte ändern. Erstellen Sie einfach eine Erweiterung von NSLayoutConstraint und verwenden Sie sie wie ->
quelle
Das Wechseln durch Ändern der aktiven Einschränkung im Code, wie in vielen anderen Antworten vorgeschlagen, hat bei mir nicht funktioniert. Also habe ich 2 Einschränkungen erstellt, eine installiert und die andere nicht, beide an den Code binden und dann wechseln, indem ich eine entferne und die andere hinzufüge.
Um der Vollständigkeit halber die Einschränkung zu binden, ziehen Sie die Einschränkung wie jedes andere grafische Element mit der rechten Maustaste in den Code:
Ich habe ein Proportionen-iPad und das andere Proportionen-Telefon genannt.
Fügen Sie dann unter viewDidLoad den folgenden Code hinzu
Ich benutze xCode 10 und Swift 5.0
quelle
Hier ist eine Antwort basierend auf der Antwort von @ Tianfu in C #. Andere Antworten, die das Aktivieren und Deaktivieren von Einschränkungen erfordern, haben bei mir nicht funktioniert.
quelle
Führen Sie die folgenden Schritte aus, um den Wert des Multiplikators zu ändern: 1. Erstellen Sie Ausgänge für die erforderliche Einschränkung, z. B. someConstraint. 2. Ändern Sie den Multiplikatorwert wie someConstraint.constant * = 0.8 oder einen beliebigen Multiplikatorwert.
das ist es, fröhliche Codierung.
quelle
Man kann lesen:
auf dieser Dokumentationsseite . Bedeutet das nicht, dass man den Multiplikator ändern kann (da es sich um eine Var handelt)?
quelle
var multiplier: CGFloat { get }
ist die Definition, was bedeutet, dass es nur einen Getter gibt.