Mam pewne problemy z NSLayoutConstraint
.Dodawanie i ustawianie NSLayoutConstraint za pomocą kodu
NSLayoutConstraint daje mi wyjątek, jeśli próbuję zmienić constant
przy użyciu metody setConstant:
. Mam tylko ten problem, gdy dodam ograniczenie wysokości za pomocą kodu.
Po pierwsze, jestem coraz ograniczenie wysokości tak:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
Który daje mi prawo ograniczenia. Mam podklasę NSTextext, gdzie to działa idealnie. Ograniczenia są ustawiane w Konstruktorze interfejsów i mogę ustawić i zmienić stałą.
Teraz mam widok, w którym dodam różne subviews podczas wykonywania. Te subviews znajdują się we własnych NIB, co oznacza, że nie mogę przypiąć ich szerokości i wysokości. Więc pomyślałem, że dodam ograniczenia, gdy tylko widok zostanie dodany do superview. To jest wykonywane w viewDidMoveToSuperview
.
// Pin Width & Height
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.width]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.height]];
Ograniczenia są dodawane, mogę to potwierdzić przy pomocy NSLog.
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
Teraz, wreszcie, gdy próbuję zmienić ograniczenie korzystania [constraint setConstant:somethingDifferent];
otrzymuję następujący wyjątek:
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)]>
To jest właśnie ograniczenie Próbuję zmienić. Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje?
EDIT
Właśnie przeczytałem, że NSAutoresizingMaskLayoutConstraint
s dodawane są automatycznie, co można wyłączyć, jeśli ustawisz [self setTranslatesAutoresizingMaskIntoConstraints:NO];
.
Jeśli wyłączę to, działa.
Jeszcze lepiej byłoby, gdybym mógł uzyskać dostęp do utworzonych NSAutoresizingMaskLayoutConstraint
. Czy ktoś wie, jak to działa?
Myślisz, że dodałeś tę zmianę podczas pisania odpowiedzi! Czy Autolayout jest włączony w Xib w celu wyświetlenia podglądu? Czy możesz pokazać kod, którego używasz, aby dodać wydział? – jrturton
@jrturton Tak, autolayout jest włączony. Może źle mnie zrozumiałeś, działa. Pomyślałem, że byłoby miło, gdybym mógł użyć 'NSAutoresizingMaskLayoutConstraint', które są już dla mnie stworzone, zamiast ich wyłączać i dodawać ograniczenia. Czy rozumiesz, co mam na myśli? – NSAddict
Mam, ale nie możesz. Jestem zaskoczony, że pojawili się w widoku zdefiniowanym na najwyższym poziomie w autolayout xib, dlatego zapytałem o kod. – jrturton