【问题标题】:How to use NSNumber or CGFloat constant in Autolayout visual format language?如何在 Autolayout 视觉格式语言中使用 NSNumber 或 CGFloat 常量?
【发布时间】:2013-08-13 08:46:21
【问题描述】:

我正在尝试使用视觉格式语言将顶部和底部填充设置为自动布局中的视图。如果我将填充作为可视格式字符串中的整数编写,则代码可以编译并工作,但是当我尝试用常量替换它时它会失败。这是我得到的错误:

由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:'无法解析约束 格式:无法设置等于宽度或高度的空间 的一种看法。也许您想使用视图作为分隔符? [view1][spacer(==view1)][view2] V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|

这是我的代码。

CGFloat const SPMTVC_kTopAndBottomPadding = 5.0;
// ...

// Create my own NSDictionary of variable bindings.
NSDictionary *variableBindings = @{@"messageTextView" : _messageTextView,
    @"contentView" : self.contentView,
    @"kTopAndBottomPadding" : [NSNumber numberWithFloat:SPMTVC_kTopAndBottomPadding]};

// Constraints in the horizontal axis.
// Basically just pins the view to the left and right of superview.
NSMutableArray *constraints = [[NSLayoutConstraint
    constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|"
    options:NSLayoutFormatAlignAllLeading
    metrics:nil
    views:variableBindings] mutableCopy];

// Constraints in vertical axis, give 5-point padding from superview's top & bottom.
[constraints addObjectsFromArray:[NSLayoutConstraint
    constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|"
    options:NSLayoutFormatAlignAllTop
    metrics:nil
    views:variableBindings]];

for (NSLayoutConstraint *constraint in constraints) {
    [self.contentView addConstraint:constraint];
}

我认为错误消息意味着编译器认为kTopAndBottomPaddingUIView,而它是字典中定义的NSNumber。有没有办法做到这一点?

【问题讨论】:

    标签: iphone ios objective-c uiview autolayout


    【解决方案1】:

    您需要在指标字典中传递kTopAndBottomPadding,而不是在视图字典中。

    此外,您可能只想利用 addConstraints: 方法,而不是搞乱可变数组和 for/in 循环。

    CGFloat const SPMTVC_kTopAndBottomPadding = 5.0;
    // ...
    
    NSDictionary *metrics = @{
        @"kTopAndBottomPadding" : @(SPMTVC_kTopAndBottomPadding)
    };
    NSDictionary *views = @{
        @"messageTextView" : _messageTextView,
        @"contentView" : self.contentView
    };
    
    [self.contentView addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|"
        options:NSLayoutFormatAlignAllLeading
        metrics:metrics views:views]];
    
    [self.contentView addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|"
        options:NSLayoutFormatAlignAllTop
        metrics:metrics views:views]];
    

    【讨论】:

      【解决方案2】:

      这就是指标字典的用途。因此,例如,如果您想在 VFL 字符串中使用“填充”作为常量,请执行以下操作:

      [constraints addObjectsFromArray:[NSLayoutConstraint
          constraintsWithVisualFormat:@"V:|-padding-[messageTextView]-kTopAndBottomPadding-|"
          options:NSLayoutFormatAlignAllTop
          metrics:@{@"padding":@5}
          views:variableBindings]];
      

      【讨论】:

      • 您也可以使用 NSDictionaryOfVariableBindings(padding) 宏创建指标字典。
      • 除非您的课程已经包含指标的 ivars,否则与仅使用字典文字相比没有太多好处
      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多