JBNSLayoutConstraint 1.0.0

JBNSLayoutConstraint 1.0.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
Released最新版本2014年12月

Mike Swanson维护。



  • 作者
  • Mike Swanson

Mike Swanson 提供

JBNSLayoutConstraint 是一组分类,它将基于字符串的线性方程和安装帮助添加到了 Auto Layout 约束中。

JBNSLayoutConstraint+LinearEquation.h 可以轻松地使用以下形式的基于字符串的线性方程创建约束

view1.attr1 == view2.attr2 * multiplier + constant @ priority

可以使用分号分隔多个表达式,同时可以将线性方程与 NSLayoutConstraint 的现有 ASCII 艺术风格的视觉格式字符串混合使用。

JBNSLayoutConstraint+Install.h 添加了方法来自动在涉及视图的每个约束的最接近的共同祖先上安装(和卸载)一个或多个约束。

虽然现在有很多 NSLayoutConstraint 分类,但我想要一个可以在单个方法中轻松传递多个视觉格式字符串的分类,并且可以使用字符串形式的线性方程来表示约束。基本上,我只是想写更少的代码。

要求

JBNSLayoutConstraint 分类已针对 iOS 进行构建和测试,并具有相同的 Auto Layout 要求:iOS 6.0 及以上。另外,虽然这些分类可能需要稍作修改即可在 Mac 开发(和 NSView)中工作,但我本人并未尝试。

JBNSLayoutConstraint+LinearEquation.h

要为项目添加基于字符串的线性方程支持,只需这样做

#import "JBNSLayoutConstraint+LinearEquation.h"

然后,您可以像这样替换传统 NSLayoutConstraint 方法

[NSLayoutConstraint
    constraintWithItem:view1
             attribute:NSLayoutAttributeCenterX
             relatedBy:NSLayoutRelationEqual
                toItem:view1.superview
             attribute:NSLayoutAttributeCenterX
            multiplier:1.0f
              constant:0.0f];

...使用基于字符串的线性方程

[NSLayoutConstraint
    jb_constraintsWithVisualFormat:@"view1.centerX==|.centerX"
                           options:0
                           metrics:nil
                             views:@{ @"view1" : view1 }];

和 Auto Layout 的视觉格式一样,竖线字符(|)引用视图的父视图。

虽然这个独立的例子并不很短,但分类的真正力量可以在创建多个约束时体现出来

[NSLayoutConstraint
    jb_constraintsWithVisualFormat:@"view1.center==|;view1.size==50"
                           options:0
                           metrics:nil
                             views:@{ @"view1" : view1 }];

这个例子使用了分类中包含的三个 复合 属性中的两个: centerframesize。这些复合属性会自动扩展以包括一组适当的约束。在这个例子中,center 扩展到包括 centerXcenterY 的属性,而 size 扩展到 widthheight

注意,第一个表达式中省略了第二个 center 属性,因为约束的两个属性都是相同的。

正如所述,线性方程可以与 Auto Layout 的视觉格式混合使用,以传递多种表达式类型

[NSLayoutConstraint
    jb_constraintsWithVisualFormat:@"H:|[view1(20)];V:|[view1];view1.height==view2+metric1"
                           options:0
                           metrics:@{ @"metric1" : @(42) },
                             views:@{ @"view1"   : view1,
                                      @"view2"   : view2 }];

复合属性

这三个复合属性扩展到包括多个约束(按照以下顺序)。

  • center 展开为:centerX, centerY
  • size 展开为:width, height
  • frame 展开为:top, left, bottom, right

JBNSLayoutConstraint+Install.h

要安装和卸载一个或多个约束,首先

#import "JBNSLayoutConstraint+Install.h"

然后,将其用于涉及视图的最近公共祖先上的约束安装

NSLayoutConstraint *constraint = ...;
[constraint jb_install];

注意,这也将为涉及视图设置为NOtranslatesAutoresizingMaskIntoConstraints

要卸载一个约束

[constraint jb_uninstall];

要安装多个约束,每个都到其涉及视图的最近公共祖先

NSArray *constraints = [NSLayoutConstraint jb_constraintsWithVisualFormat:...];
[NSLayoutConstraint jb_installConstraints:constraints];

类似于jb_install,这将涉及每个约束的视图的translatesAutoresizingMaskIntoConstraints设置为NO

类似地,卸载多个约束

[NSLayoutConstraint jb_uninstallConstraints:constraints];

最后,在一次调用中生成和安装多个约束

[NSLayoutConstraint
    jb_installConstraintsWithVisualFormat:@"view1.centerX==|.centerX"
                                  options:0
                                  metrics:nil
                                    views:@{ @"view1" : view1 }];