Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在自动布局中,我可以使用什么常量作为默认的水空间?_Macos_Cocoa_Autolayout - Fatal编程技术网

Macos 在自动布局中,我可以使用什么常量作为默认的水空间?

Macos 在自动布局中,我可以使用什么常量作为默认的水空间?,macos,cocoa,autolayout,Macos,Cocoa,Autolayout,根据,我可以在视觉约束格式语言中使用破折号来“表示标准的Aqua空间:” 但是,我似乎找不到一个NSLayout…常量或方法,允许我在不使用可视化格式语言的情况下构建约束时执行相同的操作: [self addConstraint:[NSLayoutConstraint constraintWithItem:a attribute:NSLayoutAttributeTrailing

根据,我可以在视觉约束格式语言中使用破折号来“表示标准的Aqua空间:”

但是,我似乎找不到一个
NSLayout…
常量或方法,允许我在不使用可视化格式语言的情况下构建约束时执行相同的操作:

[self addConstraint:[NSLayoutConstraint constraintWithItem:a
                                                 attribute:NSLayoutAttributeTrailing
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:b
                                                 attribute:NSLayoutAttributeLeading
                                                multiplier:1.0f
                                                  constant:<# ??? #>]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:a
属性:NSLAYUTATTRIBUTETRAILING
关系人:NSLayoutRelationEqual
项目:b
属性:NSLAYUTATTRIBUTELEADING
乘数:1.0f
常数:];
在这种情况下,我是否可以使用常量(或其他值或方法)来定义Aqua空间?

我发现同级视图之间的“标准Aqua空间”为8.0,而视图与其superview之间的“标准Aqua空间”为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
基于,我在NSLayoutConstraint类别上编写了两个方法来查找常量:

  • +standardAquaSpaceConstraintFromItem:toItem:
    返回使用可视格式语言构造的单个NSLayoutConstraint;它断言从格式生成的约束数组正好有一个项,然后获取该项并将其返回
  • +standardAquaSpaceFromItem:toItem:
    从上一个方法的约束中提取常量,并将其作为CGFloat返回
这样,如果需要进行计算,我可以自己获取常量值,或者只获取具有正确间距的单个布局约束(例如,用于指定约束
@属性或直接添加到我的视图中)。

对于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:我输入了一个错误报告,在头文件中没有提供常量

回答得很好!这是迄今为止我发现的唯一解决方案!伟大的奇怪的是,方法
standardcontbetween superview
有时返回值0.0,而不是20.0。知道为什么会这样吗?@GoGreen在ios8中?随着时间的推移,情况发生了变化,现在有了利润率——类似的情况。我只在iOS8中检查过,但即使考虑了利润率,常量值也不应该是0.0,对吗?这些方法在哪里?我可以使用它们吗?@BenLeggiero:不幸的是,实际的实现属于我的雇主,所以我不能在这里发布。然而,现在更好的解决方案可能是使用基于锚的约束方法;请参阅NSLAYOUTACHOR(在iOS上,请参阅UILAYOUTACHOR指南)。
#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