What constant can I use for the default Aqua space in Autolayout?

后端 未结 3 703
庸人自扰
庸人自扰 2020-12-13 20:12

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         


        
相关标签:
3条回答
  • 2020-12-13 20:12

    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!

    0 讨论(0)
  • 2020-12-13 20:30

    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).

    0 讨论(0)
  • 2020-12-13 20:36

    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
    
    0 讨论(0)
提交回复
热议问题