Автоматическое использование ограничений автоопределения
Я пытаюсь использовать автозапуск в своем приложении iOS программно.
У меня есть простой контроллер представления с этим кодом инициализации
UIView *innerView = [[UIView alloc] initWithFrame:self.view.bounds];
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setFrame:CGRectMake(50, 50, 150, 50)];
[button1 setTitle:@"button1" forState:UIControlStateNormal];
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setFrame:CGRectMake(250, 50, 150, 50)];
[button2 setTitle:@"button2" forState:UIControlStateNormal];
[innerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[button1][button2(==button1)]|" options:NSLayoutFormatAlignAllBaseline metrics:0 views:NSDictionaryOfVariableBindings(button1, button2)]];
[innerView addSubview:button1];
[innerView addSubview:button2];
[self.view addSubview:innerView];
Но когда я пытаюсь запустить это, я получаю эту ошибку:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format:
Unable to interpret '|' character, because the related view doesn't have a superview
|[button1][button2(==button1)]|
^'
Что с ним не так?
И когда я пытаюсь удалить трубы в constraintsWithVisualFormat
, я получаю это предупреждение:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x716be10 h=--& v=--& UIRoundedRectButton:0x71631f0.midX == + 325>",
"<NSAutoresizingMaskLayoutConstraint:0x7169940 h=--& v=--& H:[UIRoundedRectButton:0x715fb80(150)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7169860 h=--& v=--& UIRoundedRectButton:0x715fb80.midX == + 125>",
"<NSLayoutConstraint:0x7164cd0 UIRoundedRectButton:0x71631f0.width == UIRoundedRectButton:0x715fb80.width>",
"<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
И в результате этого мои ограничения не имеют никакого эффекта.
Что я делаю неправильно?
Ответы
Ответ 1
У вас есть три проблемы:
Во-первых, вам нужно отказаться от ограничений на основе макета на обоих ваших подзонах кнопок
[button1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[button2 setTranslatesAutoresizingMaskIntoConstraints:NO];
Это избавит вас от ошибок NSAutoresizingMaskLayoutConstraint. Теперь вы можете понять, что происходит с вашими ограничениями макета.
Во-вторых, перед добавлением ограничений вы должны addSubview
. Вы вызываете addContraints
в innerView перед кнопкой1, а кнопка2 - это subviews innerview.
В-третьих, вы должны указать (хотя документы указывают, что это необязательно), является ли строка макета вертикальной или горизонтальной. @"H:|[button1][button2(==button1)]|"
. Вам также понадобится вертикальное ограничение типа @"V:[button1]|"
, которое выровняло бы кнопку 1 в нижней части innerview
, а так как вы выровняли базовые линии на кнопках, кнопка 2 будет следовать.
Ответ 2
Только для записи: исключение из-за отсутствующего супервизора уже запускается с помощью constraintsWithVisualFormat
not addConstraints