OALayoutAnchor 0.2.0

OALayoutAnchor 0.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
Released最后发布2015年7月

oarrabi 维护。



  • 作者:
  • Omar Abdelhafith

OALayoutAnchor 将在 iOS 9 中引入的令人惊叹的 NSLayoutAnchor 端口到 iOS 7。

OALayoutAnchor 是到 iOS 7 的 NSLayoutAnchor 的 100% 端口,旨在为 iOS 7 提供相同的功能,并回滚到 iOS 9 和更高版本上的 NSLayoutAnchor

使用方法

要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install

使用与 NSLayoutAnchors 完全兼容。
示例使用方法(摘自苹果网站)

// Creating constraints using NSLayoutConstraint
[NSLayoutConstraint
 constraintWithItem:subview
 attribute:NSLayoutAttributeLeading
 relatedBy:NSLayoutRelationEqual
 toItem:self.view
 attribute:NSLayoutAttributeLeadingMargin
 multiplier:1.0
 constant:0.0].active = YES;

[NSLayoutConstraint
 constraintWithItem:subview
 attribute:NSLayoutAttributeTrailing
 relatedBy:NSLayoutRelationEqual
 toItem:self.view
 attribute:NSLayoutAttributeTrailingMargin
 multiplier:1.0
 constant:0.0].active = YES;

以下约束设置可以重写为以下

// Creating the same constraints using Layout Anchors
UILayoutGuide *margin = self.view.layoutMarginsGuide;

[subview.leadingAnchor constraintEqualToAnchor:margin.leadingAnchor].active = YES;
[subview.trailingAnchor constraintEqualToAnchor:margin.trailingAnchor].active = YES;

对于 iOS 7,由于在 NSLayoutConstraint 上没有 active 属性,约束集将被自动安装。下面的代码显示了 iOS 7 上的用法

// Creating the same constraints using Layout Anchors
UILayoutGuide *margin = self.view.layoutMarginsGuide;

[subview.leadingAnchor constraintEqualToAnchor:margin.leadingAnchor];
[subview.trailingAnchor constraintEqualToAnchor:margin.trailingAnchor];

有关更好的文档,请参阅 苹果文档

安装

OALayoutAnchor 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "OALayoutAnchor"

测试

有多个单元测试覆盖了大多数等式约束。将来的测试将覆盖大于或小于。

测试目前正在为 iOS 8 运行,iOS 7 的测试即将到来。

以下是一个可读的文本子脚本(使用 specipy 生成)。

在 iOS 7 中使用注意事项

由于 iOS7 的 NSLayoutConstraint 没有 active 属性,因此引入了类别 NSLayoutConstraint+SuppressActive 来在 iOS7 和 8 之间使约束的使用透明。

使用下面的下面一行

[label1.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:20].active = YES;

在 iOS 8 上,返回的约束在调用 .active = YES 时才变为活动状态。然而,在 iOS 7 上,由于在 NSLayoutConstraint 上没有活动属性,因此附加了一个方法来忽略 isActive 方法调用。

这意味着在 iOS 7 上调用 isActiveactive 不会使应用程序崩溃,这些调用将被简单地忽略。

在 Swift 中使用注意事项

由于锚UIView的属性被标注为NS_AVAILABLE_IOS(9_0);,当应用部署目标低于iOS 9时,这将使Swift无法使用这些属性。编译器不允许在不考虑iOS版本的情况下使用锚属性。

if #available(iOS 9.0, *) {
    view.leftAnchor
} else {
    // Fallback on earlier versions
}

为了解决这个问题,OALayoutAnchor包含所有锚属性的一个镜像。这些属性名称前缀为oa_

var oa_leadingAnchor: NSLayoutXAxisAnchor! { get }
var oa_trailingAnchor: NSLayoutXAxisAnchor! { get }
var oa_leftAnchor: NSLayoutXAxisAnchor! { get }
... etc..

例如,在iOS 9及以上版本中使用oa_leadingAnchor会将调用转发到leadingAnchor。在iOS 8和7上,这个调用将使用来自OALayourAnchor的布局锚。

active属性在iOS 8以下的任何iOS版本上都不可用。为了解决这个问题,请使用oa_active。使用oa_active将导致在iOS 8、9上使用active,在iOS 7上什么也不做。

以下是一个Swift使用示例

view1.oa_widthAnchor.constraintEqualToConstant(100).oa_active = true
view1.oa_heightAnchor.constraintEqualToConstant(100).oa_active = true
view1.oa_centerXAnchor.constraintEqualToAnchor(self.view.oa_centerXAnchor).oa_active = true
view1.oa_centerYAnchor.constraintEqualToAnchor(self.view.oa_centerYAnchor).oa_active = true

未来改进

以下内容是未来版本中可能需要的

  • [ ] 增加大于和小于的测试覆盖率
  • [ ] 更好的文档
  • [ ] 为iOS 7添加测试

作者

Omar Abdelhafith, [email protected]

许可证

OALayoutAnchor可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。