3

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

无效参数不满足:[constraint 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 加载的

4

3 回答 3

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];
}
于 2013-09-25T12:29:06.700 回答
5

constraintsWithVisualFormat返回一个NSArray.

@[]是用于创建NSArray.

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

这是一个不正确的方法参数addConstraints。它需要一个NSArrayof 类型的对象NSLayoutConstraint

将您的调用更改为遵循此原则将解决问题:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

顺便说一句,我看到很多关于在代码中创建自动布局约束的帖子。Interface Builder 是更高级的方法。正如 Erica Sadun 在她的《iOS Auto Layout Demystified 》一书中简洁地说:

您在 Interface Builder 中布置的任何视图都保证是可满足的。您不能在 IB 中创建具有不一致规则的错误接口。在代码中情况并非如此。

于 2013-09-25T12:39:42.373 回答
2

UIView中有两种方法

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

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

所以,

constraintsWithVisualFormat 

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

addConstraints
于 2015-11-24T00:07:14.273 回答