我可以为 Autolayout 中的默认 Aqua 空间使用啥常量?

Posted

技术标签:

【中文标题】我可以为 Autolayout 中的默认 Aqua 空间使用啥常量?【英文标题】:What constant can I use for the default Aqua space in Autolayout?我可以为 Autolayout 中的默认 Aqua 空间使用什么常量? 【发布时间】:2012-12-27 14:01:55 【问题描述】:

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

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[a]-[b]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict]];

但是,如果我使用可视格式语言构建约束而不,我似乎找不到一个NSLayout... 常量或方法可以让我做同样的事情: p>

[self addConstraint:[NSLayoutConstraint constraintWithItem:a
                                                 attribute:NSLayoutAttributeTrailing
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:b
                                                 attribute:NSLayoutAttributeLeading
                                                multiplier:1.0f
                                                  constant:<# ??? #>]];

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

【问题讨论】:

【参考方案1】:

我发现“标准 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

【讨论】:

优秀的答案!这是我迄今为止发现的唯一解决方案!太好了!【参考方案2】:

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

【讨论】:

奇怪的是,standardConstantBetweenSuperview 方法有时会返回一个值 0.0 而不是 20.0。知道为什么会这样吗? @GoGreen 在 ios8 中?事情随着它而改变,现在有利润 - 类似的东西。 我只在 iOS8 中检查过,但即使考虑边距,常量值也不应该是 0.0 对吧?【参考方案3】:

基于John Sauer's answer,我最终在 NSLayoutConstraint 类别上编写了几个方法来查找常量:

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

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

【讨论】:

这些方法在哪里?我可以使用它们吗? @BenLeggiero:不幸的是,实际实施属于我的雇主,所以我不能在这里发布。但是,现在更好的解决方案可能是使用基于锚的约束方法;请参阅 NSLayoutAnchor(以及 iOS 上的 UILayoutGuide)。

以上是关于我可以为 Autolayout 中的默认 Aqua 空间使用啥常量?的主要内容,如果未能解决你的问题,请参考以下文章

Aqua Data Studio 中的 PL/SQL 错误

UItableviewcell中的多行UIlabel使用Autolayout

在iOS中使用autolayout调整内容大小的UILabel

Autolayout中的相对中心

Aqua Data Studio 服务器注册脚本

AutoLayout:如果需要,我可以指定应该打破哪个约束并设置备份吗?