Ich habe einige Probleme mit NSLayoutConstraint
.Hinzufügen und Einstellen NSLayoutConstraint über Code
NSLayoutConstraint gibt mir eine Ausnahme, wenn ich versuche, constant
mit der setConstant:
Methode zu ändern. Ich habe nur dieses Problem, wenn ich die Höhenbeschränkung über Code hinzufüge.
Zunächst einmal, ich bin immer die Höhe Einschränkung wie so:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
Was mir die richtige Einschränkung gibt. Ich habe eine NSTextField-Unterklasse, wo dies perfekt funktioniert. Die Einschränkungen werden im Interface Builder festgelegt, und ich kann die Konstante festlegen und ändern.
Jetzt habe ich eine Ansicht, wo ich verschiedene Subviews zur Laufzeit hinzufügen. Diese Subviews befinden sich in eigenen NIBs, was bedeutet, dass ich ihre Breite und Höhe nicht festlegen kann. Also dachte ich, ich würde die Einschränkungen hinzufügen, sobald die Ansicht zu einem Superview hinzugefügt wird. Dies wird in viewDidMoveToSuperview
ausgeführt.
Die Einschränkungen werden hinzugefügt, ich kann dies mit einem NSLog bestätigen. Jetzt
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
schließlich, wenn ich versuche, den Zwang zu verändern [constraint setConstant:somethingDifferent];
mit erhalte ich die folgende Ausnahme:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10053ff10 h=--& v=&-- V:[ITControlPanelChildView:0x10192e4f0(317)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>
Das ist genau die Einschränkung ich zu ändern bin versucht. Kann mir jemand erklären, warum das passiert?
EDIT
Ich habe gerade gelesen, dass die NSAutoresizingMaskLayoutConstraint
s automatisch hinzugefügt werden, die Sie, wenn Sie [self setTranslatesAutoresizingMaskIntoConstraints:NO];
gesetzt deaktivieren.
Wenn ich es deaktiviere, funktioniert es.
Noch besser wäre, wenn ich auf die NSAutoresizingMaskLayoutConstraint
zugreifen könnte, die erstellt werden. Weiß jemand wie das funktioniert?
Ich denke, du hast diese Änderung hinzugefügt, während ich meine Antwort geschrieben habe! Ist Autolayout in der Xib für die Unteransicht aktiviert? Können Sie den Code anzeigen, den Sie zum Hinzufügen der Unteransicht verwenden? – jrturton
@jrturton Ja, das automatische Layout ist aktiviert. Vielleicht hast du mich falsch verstanden, es funktioniert. Ich dachte nur, es wäre nett, wenn ich die 'NSAutoresizingMaskLayoutConstraint' verwenden könnte, die bereits für mich erstellt wurden, anstatt sie zu deaktivieren und die Einschränkungen selbst hinzuzufügen. Hast du verstanden was ich meine? – NSAddict
tue ich, aber du kannst nicht. Ich bin überrascht, dass sie auf einer Ansicht erscheinen, die auf der obersten Ebene in einem Autolayout-Xib definiert ist, weshalb ich nach dem Code gefragt habe. – jrturton