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



我正在尝试使插入的视图填充插入它的容器视图,但是我得到了

不满足无效参数:[约束

是类的种类:[NSLayout约束类]]

- (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加载的

- (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];
}

constraintsWithVisualFormat返回一个NSArray

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

因此,这里您的方法参数addConstraints是一个具有两个元素的NSArray,每个元素都是一个NSArray

对于addConstraints来说,这是一个不正确的方法参数。它需要 NSArray NSLayoutConstraint 类型的对象。

将调用更改为按以下方式操作将解决问题:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

顺便说一下,我看到很多关于在代码中创建自动布局约束的文章。界面生成器是更优越的方法。正如 Erica Sadun 在她的书 iOS Auto Layout Demystified 中简洁地指出的那样:

您在界面生成器中布置的任何视图都保证是可以满足的。您不能在 IB 中创建规则不一致的错误接口。在代码中并非如此。

UIView 中有两个方法

//parameter type is NSArray
-(void)addConstraints:(NSArray *) constraints

// parameter type is NSLayoutConstraint
-(void)addConstraint:(NSLayoutConstraint *) constraint

所以

constraintsWithVisualFormat 

将返回一个 NSArray,您需要使用

addConstraints

最新更新