我可以在Autolayout的默认Aqua空间中使用什么常量?

Tim*_*Tim 22 macos cocoa autolayout

根据Cocoa Auto Layout Guide,我可以使用视觉约束格式语言中的破折号来"表示标准的Aqua空间:"

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[a]-[b]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict]];
Run Code Online (Sandbox Code Playgroud)

但是,NSLayout...如果我在使用可视格式语言的情况下构建约束,我似乎无法找到允许我做同样事情的常量或方法:

[self addConstraint:[NSLayoutConstraint constraintWithItem:a
                                                 attribute:NSLayoutAttributeTrailing
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:b
                                                 attribute:NSLayoutAttributeLeading
                                                multiplier:1.0f
                                                  constant:<# ??? #>]];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我是否可以使用常量(或其他值或方法)来定义Aqua空间?

Joh*_*uer 31

我发现兄弟视图之间的"标准Aqua空间"为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
Run Code Online (Sandbox Code Playgroud)


Dav*_*d H 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
Run Code Online (Sandbox Code Playgroud)

PS:我进入了一个bug报告,头文件中没有提供常量!


Tim*_*Tim 5

基于John Sauer的回答,我最后在NSLayoutConstraint类别上编写了几个方法来查找常量:

  • +standardAquaSpaceConstraintFromItem:toItem:返回使用可视格式语言构造的单个NSLayoutConstraint; 它断言从格式生成的约束数组只有一个项目,然后获取该项目并将其返回.
  • +standardAquaSpaceFromItem:toItem: 将常量从前一个方法中拉出约束并将其作为CGFloat返回.

这样,我可以自己获取常量值,如果我需要进行计算,或者只是获得具有正确间距的单个布局约束(例如,用于分配约束@property或直接添加到我的视图中).