Неожиданный NSAutoresizingMaskLayoutConstraint, добавляющий UIView из пера в сцену раскадровки автомакета

У меня есть следующее в IB, и в обоих представлениях включено «Использовать автоматический макет» и отключено «Изменение размеров подвидов».

autolayout uiview

Я просто пытаюсь добавить экземпляр Autolayout View в представление контейнера, чтобы его края соответствовали краям представления контейнера. Представление контейнера использует автоматическую компоновку и имеет ту же высоту, но ширина в два раза больше. Вот код:

- (IBAction)addSubviewButton:(id)sender
{
  UIView *autolayoutView = [[[NSBundle mainBundle] loadNibNamed:@"AutolayoutView" owner:nil options:nil] objectAtIndex:0];
  [self.containerView addSubview:autolayoutView];

  [self.containerView addConstraint:
   [NSLayoutConstraint constraintWithItem:autolayoutView
                            attribute:NSLayoutAttributeLeading
                            relatedBy:NSLayoutRelationEqual
                               toItem:self.containerView
                            attribute:NSLayoutAttributeLeading
                           multiplier:1
                             constant:0]];
  [self.containerView addConstraint:
   [NSLayoutConstraint constraintWithItem:autolayoutView
                            attribute:NSLayoutAttributeTrailing
                            relatedBy:NSLayoutRelationEqual
                               toItem:self.containerView
                            attribute:NSLayoutAttributeTrailing
                           multiplier:1
                             constant:0]];
  [self.containerView addConstraint:
  [NSLayoutConstraint constraintWithItem:autolayoutView
                           attribute:NSLayoutAttributeTop
                           relatedBy:NSLayoutRelationEqual
                              toItem:self.containerView
                           attribute:NSLayoutAttributeTop
                          multiplier:1.0
                            constant:0.0]];
  [self.containerView addConstraint:
  [NSLayoutConstraint constraintWithItem:autolayoutView
                           attribute:NSLayoutAttributeBottom
                           relatedBy:NSLayoutRelationEqual
                              toItem:self.containerView
                           attribute:NSLayoutAttributeBottom
                          multiplier:1.0 constant:0.0]];
}

Возникает ошибка:

Probably at least one of the constraints in the following list is one you don't want...
(
"<NSIBPrototypingLayoutConstraint:0x8c364d0 'IB auto generated at build time for view with fixed frame' H:[UIView:0x8c356f0(275)]>",
"<NSLayoutConstraint:0x8d43d80 H:|-(0)-[AutolayoutView:0x8d47a30]   (Names: '|':UIView:0x8c356f0 )>",
"<NSLayoutConstraint:0x8d09260 AutolayoutView:0x8d47a30.trailing == UIView:0x8c356f0.trailing>",
"<NSAutoresizingMaskLayoutConstraint:0x8d0eca0 h=--& v=--& AutolayoutView:0x8d47a30.midX == + 70>"
)

Похоже, NSAutoresizingMaskLayoutConstraint автоматически создается в представлении Autolayout после его добавления в качестве подпредставления? При печати ограничений Autolayout View в didMoveToSuperview он еще не существует. Как это можно решить? Я хотел попробовать создать ограничения для Autolayout View в IB в качестве заполнителей, которые следует игнорировать во время сборки, но в IB отключены все параметры autolayout для Autolayout View.


person 1192805    schedule 03.08.2014    source источник
comment
Проверьте атрибуты представления верхнего уровня в IB. Должен быть установлен флажок «Преобразует маску автоматического изменения размера в ограничения». Вам нужно отключить это. Кроме того, вы можете установить свойство translatesAutoresizingMaskIntoConstraints в коде после загрузки представления.   -  person Ken Thomases    schedule 03.08.2014
comment
@KenThomases спасибо за совет. Отключение translatesAutoresizeMaskIntoConstraints в коде сработало. «Использовать Autolayout» было самым близким, что я мог найти в IB, но ограничение Autoresize все еще создавалось.   -  person 1192805    schedule 03.08.2014


Ответы (1)


Самый простой способ снять это ограничение — установить translatesAutoresizingMaskIntoConstraints вашего представления на false в Swift (или на NO в Objective-C). Вы можете сделать это вообще без кода. Вы можете использовать ключевые пути в конструкторе интерфейсов (скрин прилагается).

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

person Rafał Augustyniak    schedule 03.08.2014