根据Cocoa Auto Layout Guide,我可以使用视觉约束格式语言中的破折号“表示标准的Aqua空间:”
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[a]-[b]"
options:0
metrics:nil
views:viewDict]];
但是,如果我使用可视格式语言构建一个没有的约束,我似乎无法找到允许我做同样事情的NSLayout...
常量或方法:
[self addConstraint:[NSLayoutConstraint constraintWithItem:a
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:b
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:<# ??? #>]];
在这种情况下,我是否可以使用常量(或其他值或方法)来定义Aqua空间?
答案 0 :(得分:29)
我找到了标准的Aqua空间&#34;在兄弟视图之间是8.0,在视图和它的超级视图之间是20.0。
NSView* view = [NSView new] ;
NSLayoutConstraint* constraintWithStandardConstantBetweenSiblings = [NSLayoutConstraint constraintsWithVisualFormat:@"[view]-[view]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view) ] [0] ;
CGFloat standardConstantBetweenSiblings = constraintWithStandardConstantBetweenSiblings.constant ; // 8.0
NSView* superview = [NSView new] ;
[superview addSubview:view] ;
NSLayoutConstraint* constraintWithStandardConstantBetweenSuperview = [NSLayoutConstraint constraintsWithVisualFormat:@"[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view) ] [0] ;
CGFloat standardConstantBetweenSuperview = constraintWithStandardConstantBetweenSuperview.constant ; // 20.0
答案 1 :(得分:10)
对于iOS用户:
#import "NSLayoutConstraint+StandardOffsets.h"
@implementation NSLayoutConstraint (StandardOffsets)
+ (CGFloat)standardConstantBetweenSiblings
{
static CGFloat value;
if(!isnormal(value)) {
UIView *view = [UIView new] ;
NSLayoutConstraint* constraintWithStandardConstantBetweenSiblings = [NSLayoutConstraint constraintsWithVisualFormat:@"[view]-[view]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view) ] [0] ;
value = constraintWithStandardConstantBetweenSiblings.constant ; // 8.0
}
return value;
}
+ (CGFloat)standardConstantBetweenSuperview
{
static CGFloat value;
if(!isnormal(value)) {
UIView *view = [UIView new] ;
UIView *superview = [UIView new] ;
[superview addSubview:view] ;
NSLayoutConstraint* constraintWithStandardConstantBetweenSuperview = [NSLayoutConstraint constraintsWithVisualFormat:@"[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view) ] [0] ;
value = constraintWithStandardConstantBetweenSuperview.constant ; // 20.0
}
return value;
}
@end
PS:我输入了一个bug报告,在头文件中没有提供常量!
答案 2 :(得分:5)
基于John Sauer's answer,我最终在NSLayoutConstraint类别上编写了几个方法来查找常量:
+standardAquaSpaceConstraintFromItem:toItem:
返回使用可视格式语言构造的单个NSLayoutConstraint;它断言从格式生成的约束数组只有一个项目,然后获取该项目并将其返回。+standardAquaSpaceFromItem:toItem:
将常量从前一个方法中拉出约束,并将其作为CGFloat返回。这样,如果我需要进行计算,我可以自己获取常量值,或者只使用正确的间距获得单个布局约束(例如,为了分配约束@property
或者直接添加到我的视图中)。