将实例变量与 NSLayoutConstraint 的视觉格式一起使用是不是有最佳实践?

Posted

技术标签:

【中文标题】将实例变量与 NSLayoutConstraint 的视觉格式一起使用是不是有最佳实践?【英文标题】:Is there a best practice for using instance variables with NSLayoutConstraint's Visual Format?将实例变量与 NSLayoutConstraint 的视觉格式一起使用是否有最佳实践? 【发布时间】:2013-06-13 18:55:31 【问题描述】:

假设我有一个来自名为 label 的超类的实例变量,并且我想使用可视格式设置自动布局约束。如果我尝试在格式字符串中使用 self.label,则会出现解析错误,并且我无法从子类访问 _label。当前有效的解决方法如下,但看起来有点难看。有没有更好的办法?

    UILabel *label = self.label;
    NSDictionary *views = NSDictionaryOfVariableBindings(label, _textField);

    [self.contentView addConstraints:
     [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label(==_textField)][_textField(==label)]-|"
                                             options:NSLayoutFormatAlignAllCenterY
                                             metrics:nil
                                               views:views]];

【问题讨论】:

【参考方案1】:

constraintsWIthVisualFormat 需要一个视图字典,但它不必来自NSDictionaryOfVariableBindings 例如:

UILabel *label = self.label;
NSDictionary *views = @@"label":self.label, @"_textField":_textField;

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label(==_textField)][_textField(==label)]-|"
                                         options:NSLayoutFormatAlignAllCenterY
                                         metrics:nil
                                           views:views]];

我还没有测试过,所以如果我的顺序或语法错误,请告诉我,以便我修复它,但重点是你的字典可以是任意的。

【讨论】:

当你只有一个属性时,这是处理 VFL 的方法。如果有帮助,我已经详细地写过这个here。

以上是关于将实例变量与 NSLayoutConstraint 的视觉格式一起使用是不是有最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSLayoutConstraint 实例化和设置 UIButton 子类的大小

NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

错误:NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

如何在 swift 的扩展中声明 NSLayoutConstraint 类型的变量

NSLayoutConstraint 等高不等分

NSLayoutConstraint 设置