Загадочные ограничения NSLayoutConstraints, вызывающие конфликты

Я использую MGSplitViewClass (ссылка) В указанном разделенном представлении у меня есть в главном представлении набор из четырех UIView, которые содержат более надежные представления (табличные представления, группы меток и представление коллекции).

Сначала я попытался добавить UICollectionView в свой наконечник и программно создал контроллер представления коллекции и подключил его к представлению коллекции моего наконечника. Это ужасно провалилось, как только я попробовал _collectionViewController.collectionView = myCollectionView;. Это дало ошибки о том, что представление моего пера находится за пределами поддерева 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal.

Хорошо, теперь я удалю представление коллекции из своего пера и добавлю тот, с которым поставляется контроллер представления коллекции, вот так.

_collectionViewController = [[[MyCollectionViewController alloc] initWithCollectionViewLayout: [[[MyCollectionLayout alloc] init] autorelease]] retain];
[_collectionViewController.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
UICollectionView* collectionView = _attachmentController.collectionView;
[_collectionViewContainer addSubview:collectionView];

Это работает, но представление коллекции значительно превышает размер контейнера представления и другие проблемы с макетом. Теперь, очевидно, представление не будет прокручиваться должным образом, поэтому я должен это исправить.

Поэтому я добавляю некоторые ограничения, чтобы размер представления заполнил представление контейнера.

NSMutableArray* constraints = [[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[collectionView]|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(collectionView)] mutableCopy];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|[collectionView]|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(collectionView)]];
for (NSLayoutConstraint* lc in constraints)
    [_attachmentViewContainer addConstraint:lc];

Но тут становится хреново. После запуска я получаю больше ошибок макета.

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
"<NSAutoresizingMaskLayoutConstraint:0x1d8c0b80 h=-&- v=-&- UICollectionView:0x1cb55400.midX == UIView:0x1d894300.midX - 10>",
"<NSLayoutConstraint:0x1c5a74b0 H:[UICollectionView:0x1cb55400]-(0)-|   (Names: '|':UIView:0x1d894300 )>",
"<NSLayoutConstraint:0x1c5a7440 H:|-(0)-[UICollectionView:0x1cb55400]   (Names: '|':UIView:0x1d894300 )>"

а также

"<NSAutoresizingMaskLayoutConstraint:0x1d8c0d10 h=-&- v=-&- UICollectionView:0x1cb55400.midY == UIView:0x1d894300.midY + 437>",
"<NSLayoutConstraint:0x1c5a71a0 V:[UICollectionView:0x1cb55400]-(0)-|   (Names: '|':UIView:0x1d894300 )>",
"<NSLayoutConstraint:0x1c5a6f30 V:|-(0)-[UICollectionView:0x1cb55400]   (Names: '|':UIView:0x1d894300 )>"

Откуда взялись эти случайно выглядящие NSAutoresizingMaskLayoutConstraints? Лучше вопрос, где я могу избавиться от них? Кажется, я не могу найти ни одной точки в коде, чтобы прыгнуть, чтобы убить их. -viewWillAppear: не распространяется за пределы UIViewController, поэтому я застрял.

Любые мысли очень приветствуются.


person macawm    schedule 30.01.2013    source источник


Ответы (1)


Непосредственно перед тем, как добавить эти ограничения, попробуйте добавить эту строку:

[коллекцияView setTranslatesAutoresizingMaskIntoConstraints: НЕТ];

Система автоматически преобразует маску автоматического изменения размера по умолчанию в ограничения, если вы не установите для этого параметра значение НЕТ.

person rdelmar    schedule 30.01.2013
comment
Что ж, это творит чудеса. Теперь я собираюсь найти документацию, которая подробно объясняет это. - person macawm; 30.01.2013
comment
@macawm, вы должны посмотреть видео (их 3) с WWDC 2012. - person rdelmar; 30.01.2013
comment
Я помню эти сейчас. Прошло некоторое время с тех пор, как я смотрел их, с тех пор, как они были впервые выпущены, если я правильно помню. Мне придется пересмотреть их снова. Спасибо. - person macawm; 31.01.2013