According to the Cocoa Auto Layout Guide, I can use a dash in the visual constraint format language to \"denote the standard Aqua space:\"
[self addConstrain
For iOS users:
#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: I entered a bugreport that no constant is offered in the header files!
Based on John Sauer's answer, I wound up writing a couple methods on an NSLayoutConstraint category to find the constants:
+standardAquaSpaceConstraintFromItem:toItem:
returns a single NSLayoutConstraint constructed using the visual format language; it asserts that the array of constraints generated from the format has exactly one item, then gets that item and gives it back.+standardAquaSpaceFromItem:toItem:
pulls the constant out of the constraint from the previous method and returns it as a CGFloat.This way, I can either get the constant value myself if I need to do computations, or just get a single layout constraint with the right spacing (e.g. for assigning to a constraint @property
or directly adding to my view).
I've found the "standard Aqua space" to be 8.0 between sibling views, and 20.0 between a view and its superview.
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