tutorial ratio priority constraint align macos cocoa autolayout

macos - ratio - swift 4 autolayout



¿Qué constante puedo usar para el espacio Aqua predeterminado en Autolayout? (3)

Basándome en la respuesta de John Sauer , terminé escribiendo un par de métodos en una categoría NSLayoutConstraint para encontrar las constantes:

  • +standardAquaSpaceConstraintFromItem:toItem: devuelve una única NSLayoutConstraint construida con el lenguaje de formato visual; afirma que la matriz de restricciones generadas a partir del formato tiene exactamente un elemento, luego obtiene ese elemento y lo devuelve.
  • +standardAquaSpaceFromItem:toItem: saca la constante de la restricción del método anterior y la devuelve como CGFloat.

De esta manera, yo mismo puedo obtener el valor constante si necesito realizar cálculos, o simplemente obtener una única restricción de diseño con el espacio correcto (por ejemplo, para asignar una @property restricción o agregar directamente a mi vista).

De acuerdo con la Guía de diseño automático de Cocoa , puedo usar un guión en el lenguaje de formato de restricción visual para "denotar el espacio Aqua estándar:"

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

Sin embargo, parece que no puedo encontrar una constante o método NSLayout... que me permita hacer lo mismo si estoy creando una restricción sin usar el lenguaje de formato visual:

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

¿Hay una constante (u otro valor o método) que pueda usar para definir el espacio Aqua en tal situación?


He encontrado que el "espacio Aqua estándar" es 8.0 entre vistas de hermanos y 20.0 entre una vista y su vista de supervisión.

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


Para usuarios de 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

PD: ¡Ingresé un informe de error que no se ofrece ninguna constante en los archivos de encabezado!