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!