Почему я не могу установить ограничения Auto Layout при добавлении ограничений в представление, которое я добавил в UIWindow?

Чтобы создать темное наложение на экране, я добавляю представление поверх всех остальных представлений в UIWindow:

UIView *darkOverlayView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
darkOverlayView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.85];

Затем я хочу центрировать UIImageView в новом darkOverlayView и попытаться сделать следующее:

UIImageView *imageFromLink = [[UIImageView alloc] initWithImage:responseObject];
imageFromLink.translatesAutoresizingMaskIntoConstraints = NO;
            CGFloat widerThanHeightBy = imageFromLink.bounds.size.width / imageFromLink.bounds.size.height;

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.width]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.height / widerThanHeightBy]];

Но каждый раз, когда он запускается, я получаю сообщение об ошибке:

Иерархия представлений не подготовлена ​​для ограничения: при добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления). Это приведет к сбою, если ограничение необходимо разрешить до сборки иерархии представлений. Перерыв на -[UIView _viewHierarchyUnpreparedForConstraint:] для отладки. 2013-12-07 00:59:03.626 Jupiter[58008:70b] Просмотр иерархии не готов к ограничению. Ограничение: Иерархия контейнеров: > Представление не найдено в иерархии контейнеров: > - (null) Суперпредставление этого представления: NO SUPERVIEW

Как бы я обойти это? Или я должен использовать фреймы?


person Doug Smith    schedule 07.12.2013    source источник


Ответы (2)


Как сказать @rdelmar:

Во-первых: где вы добавляете свой imageFromLink, например addSubView, в супервизор?

Во-вторых: ваши ограничения:

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.width]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.height / widerThanHeightBy]];

настроить только Width и height, а как насчет x и y

просто добавьте еще два ограничения:

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:darkOverlayView attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:darkOverlayView attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]];

это заданная позиция в центре darkOverlayView.

person Bimawa    schedule 08.12.2013

При добавлении ограничений к представлению, включающему два представления, одно представление должно быть подпредставлением другого, поэтому вам нужно будет добавить imageFromLink в качестве подпредставления darkOverLayView, прежде чем добавлять ограничения. Однако в этом случае, когда вы добавляете ограничения по ширине и высоте, эти ограничения следует добавлять в imageFromLink, а не в его суперпредставление. Этот тип ограничения фиксированной ширины или высоты не включает никаких других представлений, поэтому он должен принадлежать самому представлению, а не суперпредставлению.

Однако добавление ограничения по высоте и ширине не центрирует его в своем супервизоре. Вам также необходимо добавить (после создания imageFromLink подпредставления) ограничение centerX и centerY в darkOverlayView.

person rdelmar    schedule 07.12.2013