Нужна помощь в программном создании ограничений автоматического макета

Это первый раз, когда я пытаюсь создать auto layouts constraints программно, и вот мой код

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:view1];
    [view1 setTranslatesAutoresizingMaskIntoConstraints:NO];

    NSDictionary *views = NSDictionaryOfVariableBindings(view1);

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[view1]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view1]-|" options:0 metrics:nil views:views];

    [view1 addConstraints:constraints];

    [view1 addConstraints:verticalConstraints];
}

Это то, что я пытаюсь сделать в коде.

введите здесь описание изображения

И эта огромная ошибка, которую я получаю

2015-12-16 12:13:59.254 test5b[1138:430691] Иерархия представлений не подготовлена ​​для ограничения: при добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления). Это приведет к сбою, если ограничение необходимо разрешить до сборки иерархии представлений. Перерыв на -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] для отладки. 16.12.2015 12:13:59.259 test5b[1138:430691] Просмотр иерархии не подготовлен для ограничения. Ограничение: Иерархия контейнеров: > Представление не найдено в иерархии контейнеров: > Суперпредставление этого представления: ; layer = > 2015-12-16 12:13:59.260 test5b[1138:430691] * Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: «Невозможно установить ограничение на представление. Ссылается ли ограничение на что-то вне поддерева представления? Это незаконно. ограничение: вид:>»* Первый стек бросить вызов: (0x1829f4f5c 0x1975e7f80 0x1829f4ea4 0x183890ef4 0x18804c620 0x18804c428 0x18804c2d0 0x18804c194 0x188056504 0x183890aa0 0x18805330c 0x188056420 0x1000d65f0 0x187f63a0c 0x187fd2fcc 0x187fd2f68 0x1881f494c 0x188200de4 0x1829ac48c 0x1829abdc4 0x1829a9d28 0x1828d8dc0 0x18da2c088 0x187fb2f60 0x1000d6ab8 0x197e128b8) Libc ++ abi.dylib : завершение с необработанным исключением типа NSException (lldb)


person S.J    schedule 16.12.2015    source источник


Ответы (1)


Добавьте ограничения в self.view. Замените следующее:

[view1 addConstraints:constraints];
[view1 addConstraints:verticalConstraints];

с участием

[self.view addConstraints:constraints];
[self.view addConstraints:verticalConstraints];
person Irfan    schedule 16.12.2015
comment
Спасибо, это сработало, но почему self.view, я хочу, чтобы они были в представлении1, как мы делаем в раскадровке Ctrl + перетаскивание из представления1 в суперпредставление... - person S.J; 16.12.2015
comment
stackoverflow.com/questions/18177262/ Укажите вескую причину, по которой мы добавляем ограничение для себя. View1 не находится в иерархии представлений. - person Irfan; 16.12.2015
comment
почему view1 не находится в иерархии, которую я сделал [self.view addsubview: view1], и если я применю то же самое в раскадровке и выберу view1, то в инспекторе размера все ограничения появятся для view1. - person S.J; 16.12.2015
comment
Вы устанавливаете ограничения, чтобы представление знало, как размещать его подпредставления. Представление не имеет себя в своей иерархии подвидов... - person Wain; 16.12.2015
comment
@Ирфан Большое спасибо :). - person S.J; 16.12.2015
comment
Начиная с iOS 8 вы больше не должны использовать addConstraints:. Используйте +[NSLayoutConstraint activateConstraints:] или -[NSLayoutConstraint setActive:]. - person jscs; 16.12.2015
comment
@JoshCaswell Большое спасибо - person S.J; 16.12.2015