自动布局,插入视图以填充容器视图

时间:2013-09-25 12:20:25

标签: cocoa autolayout

我试图让插入的视图填充插入它的容器视图,但是我得到了

无效参数不满足:[约束isKindOfClass:[NSLayoutConstraint class]]

- (void)insertedView:(NSView *)insertedView needsToFillContainerView:(NSView *)containerView {

    [containerView addSubview:insertedView];
    [containerView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [containerView addConstraints:@[
                                    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[insertedView]|"
                                                                            options:0
                                                                            metrics:nil
                                                                              views:NSDictionaryOfVariableBindings(insertedView)],
                                    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[insertedView]|"
                                                                            options:0
                                                                            metrics:nil
                                                                              views:NSDictionaryOfVariableBindings(insertedView)]
                                    ]
    ];

}

基本上我要插入的一个视图是从VC加载的

1 个答案:

答案 0 :(得分:5)

constraintsWithVisualFormat会返回NSArray

@[]是创建NSArray的Objective C文字。

因此,此处addConstraints的方法参数是NSArray,其中包含两个元素,每个元素都是NSArray

addConstraints这是一个不正确的方法参数。它期望NSArray类型为NSLayoutConstraint的对象。

将调用更改为与此相关将解决问题:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

顺便说一下,我看到很多关于在代码中创建自动布局约束的帖子。 Interface Builder是最好的方法。正如Erica Sadun如此简洁地将其写入她的书iOS Auto Layout Demystified

  

您在Interface Builder中展示的任何视图都可以保证满意。您无法在IB中创建具有不一致规则的错误的接口。在代码中也是如此。