如何在Autolayout可视化格式语言中使用NSNumber或CGFloat常量?

时间:2013-08-12 05:40:56

标签: iphone ios objective-c uiview autolayout

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

  

由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'无法解析约束   格式:无法设置等于宽度或高度的空间   一个观点。也许您想使用视图作为间隔?   [厂景] [垫片(==厂景)] [视图2]   五:| -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。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:2)

您需要在指标字典中传递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]];