Подтвердить что ты не робот

Какую константу я могу использовать для стандартного пространства Aqua в Autolayout?

В соответствии с Cocoa Руководство по автоматическому макету, я могу использовать тире на языке формата визуального ограничения, чтобы "обозначить стандартное пространство 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 в такой ситуации?

4b9b3361

Ответ 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: я ввел сообщение об ошибке, что константа не предлагается в файлах заголовков!

Ответ 3

Основываясь на ответе Джона Зауера, я обнаружил, что написал несколько методов в категории NSLayoutConstraint, чтобы найти константы:

  • +standardAquaSpaceConstraintFromItem:toItem: возвращает один NSLayoutConstraint, построенный с использованием языка визуального формата; он утверждает, что массив ограничений, сгенерированных из формата, имеет ровно один элемент, затем получает этот элемент и возвращает его.
  • +standardAquaSpaceFromItem:toItem: извлекает константу из ограничения из предыдущего метода и возвращает ее как CGFloat.

Таким образом, я могу либо получить постоянное значение самостоятельно, если мне нужно делать вычисления, либо просто получить одно ограничение компоновки с правильным интервалом (например, для назначения ограничению @property или непосредственного добавления в мое представление).