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

Pet*_*isu 3 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)]
                                    ]
    ];

}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*isu 8

- (void)addSubview:(NSView *)insertedView fillingAndInsertedIntoView:(NSView *)containerView {

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

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

    [containeView layoutIfNeeded];
}
Run Code Online (Sandbox Code Playgroud)


Max*_*eod 5

constraintsWithVisualFormat返回一个NSArray.

@[]是Objective C文字来创建一个NSArray.

所以,这里你的方法参数addConstraints是一个NSArray有两个元素,每个元素都是一个NSArray.

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

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

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我看到很多关于在代码中创建自动布局约束的帖子.Interface Builder是最好的方法.正如埃里卡·萨杜(Erica Sadun)如此简洁地将其置于她的书中,iOS Auto Layout Demystified:

您在Interface Builder中布局的任何视图都保证是可以满足的.您无法在IB中使用不一致的规则创建错误的接口.在代码中也是如此.