NSLayoutConstraint Konstante nicht aktualisieren, nach dem setzen
Ich habe eine UIView
Unterklasse mit einer entsprechenden xib
- Datei. In meinem xib-ich habe eine NSLayoutConstraint
Eigenschaft, die ich versuche zu animieren. Ich habe eine animateIn
Methode. Das problem ist, dass nur die animateIn Methode funktioniert. Wenn ich versuche zu aktualisieren, die Konstante wieder ist es einfach bleibt auf dem vorherigen Wert.
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;
Ich versuche zu aktualisieren, die konstant nach dem drücken einer Taste. Aber die Konstante scheint sich nicht zu aktualisieren, nachdem Sie die Einstellung. Es noch logs 0, auch nachdem Sie es auf -500. Ich rufe layoutIfNeeded
aber es passiert nichts.
//this works
- (void) animateIn {
[UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.horizontalConstraint.constant = 0;
[self layoutIfNeeded];
} completion:^(BOOL finished) {
}];
}];
}
//this does not work
- (IBAction)resume:(id)sender {
self.horizontalConstraint.constant = -500;
[self layoutIfNeeded];
NSLog(@"%f",self.horizontalConstraint.constant); //this always stays 0
}
UPDATE
Es scheint, dass meine NSLayoutConstraint ist (null), wenn ich wollen es ein zweites mal. Das würde erklären, warum es nicht aktualisiert wird. Wie sollte ich einen Verweis darauf beibehalten?
null
dann versuchen mit strong
Zeiger.InformationsquelleAutor Ramin Afshar | 2014-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie rufen
setNeedsUpdateConstraints
Methode der entsprechendenUIView(control)
Ihr NSLayoutConstraint vorhanden ist, um update-Einschränkung.Beispielsweise UIButton
In Ihrem Fall
setNeedsUpdateConstraints
wenn Sie brauchen, um Sie zu aktualisieren, und ändern Sie dann dieconstant
innerhalb derupdateViewConstraints
Methode, wird automatisch aufgerufen. Oder, Sie können ändern Sie die Konstante in der Methode, die es erfordert, (halten die code verknüpft mehr dicht) und dann rufen SiesetNeedsLayout
auf die Einschränkung der Sichtsuperview
.Ich Stimme mit Ihrer Charakterisierung hier. Sie kann überschreiben
updateConstraints()
zu erleichtern, eine komplexe Reihe von batch-änderungen. Doch aus der Dokumentation: > Es ist fast immer sauberer und einfacher zu aktualisieren, eine Einschränkung, die unmittelbar nach der Veränderung stattgefunden hat. ... > sollten Sie nur überschreiben Sie diese Methode beim ändern von Einschränkungen in Platz zu langsam ist, oder wenn eine Sicht ist die Herstellung einer Anzahl redundanter änderungen.InformationsquelleAutor Yogesh Suthar
Sind Sie sicher, dass diese Einschränkung wird nicht de-aktiviert irgendwo?
Die Einstellung der "aktiven" Eigenschaft von einer Einschränkung auf false bewirkt, dass die view-Hierarchie entfernen Sie die Einschränkung. Wenn Sie nicht auch einen Verweis, die Einschränkung Objekt wird aus dem Speicher gelöscht.
Hatte ich das gleiche Problem wie du, und entfernt die "schwachen", so die Einschränkung, ist jetzt eine starke Eigenschaft. Folglich, es ist nicht auf null, wenn de-aktiviert (weil meine view-controller hat immer eine starke Zeiger darauf), und ich kann wieder aktivieren und erneut seine Konstante.
InformationsquelleAutor Frédéric Adda
wenn Sie fertig mit Ihrem constraint-änderungen einfach anrufen:
InformationsquelleAutor Bogdan Somlea
Ich lief in ein problem, wo ich das erste mal einstellen, wird die Einschränkung Konstante im code die Konstanten festgelegt werden würde, aber dann nach dem Aufruf layoutIfNeeded(), wie diese:
den Konstanten gehen würde, zurück auf den ursprünglichen Wert! Ich konnte beobachten Sie den Wert ändern, wieder in den debugger.
Ich endlich herausgefunden, dass es daran lag, in das storyboard hatte ich eine variation der Konstanten. Zum Beispiel:
Sobald ich entfernte die variation, die Einschränkung Konstanten Wert nicht wieder auf den ursprünglichen Wert mit layoutIfNeeded nennen.
InformationsquelleAutor CLK
Den horizontalConstraint Eigenschaft hielt, die durch den view selbst. Solange die Sicht am Leben ist, sollte das Objekt nicht null (es sei denn, Sie setzen es auf null explizit irgendwo anders im code). Überprüfen Sie, ob Sie setzen es auf null, indem Sie Fehler.
InformationsquelleAutor Nikolay Markov