神秘的NSLayoutConstraints导致冲突

时间:2013-01-30 00:06:24

标签: ios autolayout

我正在使用MGSplitViewClass (link),我很难正确设置UICollectionView的大小。在所述拆分视图中,我在主视图中有一组包含更强大视图的四个UIView(表视图,标签组和集合视图)。

首先,我尝试在我的nib中添加UICollectionView,并以编程方式创建了一个集合视图控制器,并将其连接到我的nib的集合视图。一旦我尝试,这很可怕 _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来自哪里?一个更好的问题是我可以在哪里摆脱它们?我似乎无法在代码中找到一个单点来跳死它们。 <{1}}不会传播到UIViewController之外,所以我有点卡住了。

非常欢迎任何想法。

1 个答案:

答案 0 :(得分:2)

在添加这些约束之前,请尝试添加以下行:

[collectionView setTranslatesAutoresizingMaskIntoConstraints:NO];

系统会自动将默认自动调整遮罩转换为约束,除非您将其设置为NO。