23

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:<# ??? #>]];

そのような状況でアクアスペースを定義するために使用できる定数(または別の値またはメソッド)はありますか?

4

3 に答える 3

32

「標準のアクアスペース」は、兄弟ビュー間で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
于 2012-12-27T16:03:05.610 に答える
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:ヘッダーファイルに定数が提供されていないというバグレポートを入力しました!

于 2013-09-28T01:55:01.590 に答える
5

John Sauerの回答に基づいて、定数を見つけるためにNSLayoutConstraintカテゴリにいくつかのメソッドを記述しました。

  • +standardAquaSpaceConstraintFromItem:toItem:ビジュアルフォーマット言語を使用して構築された単一のNSLayoutConstraintを返します。フォーマットから生成された制約の配列に1つのアイテムがあることを表明し、そのアイテムを取得して返します。
  • +standardAquaSpaceFromItem:toItem:前のメソッドの制約から定数を引き出し、CGFloatとして返します。

このようにして、計算を行う必要がある場合は自分で定数値を取得するか、適切な間隔で単一のレイアウト制約を取得することができます(たとえば、制約に割り当てる@propertyか、ビューに直接追加するため)。

于 2012-12-27T23:11:18.230 に答える