我正在尝试使插入的视图填充插入它的容器视图,但是我得到了
不满足无效参数:[约束是类的种类:[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