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 的测试即将到来。
由于 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 上调用 isActive
或 active
不会使应用程序崩溃,这些调用将被简单地忽略。
由于锚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
以下内容是未来版本中可能需要的
Omar Abdelhafith, [email protected]
OALayoutAnchor可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。