适用于iOS & OS X Auto Layout的终极API — 非常简单,非常强大。PureLayout扩展了UIView
/NSView
、NSArray
和NSLayoutConstraint
,使用与Apple自用框架相似的全面Auto Layout API。PureLayout是一个跨平台的Objective-C库,在Swift中(看起来!)运行良好。它与所有支持Auto Layout的iOS和OS X版本完全向后兼容。
从头开始编写Auto Layout代码并不容易。PureLayout提供了一个功能齐全、针对开发者友好的Auto Layout接口。它旨在清晰和简单,并借鉴了Interface Builder中可用的Auto Layout UI选项,同时提供了更高的灵活性。该API还效率极高,因为它仅添加了一层薄薄的第三方代码,并针对最佳性能设计。
目录
设置
兼容性
PureLayout 的当前版本支持所有版本的 iOS 和 OS X,自从每个平台上引入 Auto Layout 以来,无论是 Swift 还是 Objective-C,都使用单一代码库!
- Xcode
- 语言支持: Swift(任何版本),Objective-C
- 完全兼容: Xcode 7.0
- 最低支持版本: Xcode 5.0
- iOS
- 完全兼容: iOS 9.0
- 最低部署目标: iOS 6.0
- OS X
- 完全兼容: OS X 10.11
- 最低部署目标: OS X 10.7
CocoaPods
使用- 将
PureLayout
库添加到您的 Podfile 中。
pod 'PureLayout'
- 在终端中运行
pod install
,然后打开您的应用的相关文件.xcworkspace
以启动 Xcode。 - 导入
PureLayout.h
头文件。
- 在您的 Podfile 中使用
use_frameworks!
- Swift:
import PureLayout
- Objective-C:
#import <PureLayout/PureLayout.h>
(或启用 Module:@import PureLayout;
)
- Swift:
- 在您的 Podfile 中不使用
use_frameworks!
- Swift:将
#import "PureLayout.h"
添加到您的桥接头文件。 - Objective-C:
#import "PureLayout.h"
- Swift:将
这就完成了。现在开始编写一些美丽的 Auto Layout 代码吧!
Carthage
使用- 将
PureLayout/PureLayout
项目添加到您的 Cartfile。
github "PureLayout/PureLayout"
- 运行
carthage update
,然后执行 其他必需步骤 将框架添加到您的项目中。 - 导入 PureLayout 框架/模块。
- Swift:
import PureLayout
- Objective-C:
#import <PureLayout/PureLayout.h>
(或启用 Module:@import PureLayout;
)
这就完成了。现在开始编写一些美丽的 Auto Layout 代码吧!
从 GitHub 手动导入
- 下载 PureLayout 子目录 中的源文件。
- 将源文件添加到您的 Xcode 项目。
- 导入
PureLayout.h
头文件。
- Swift:将
#import "PureLayout.h"
添加到您的桥接头文件。 - Objective-C:
#import "PureLayout.h"
这就完成了。现在开始编写一些美丽的 Auto Layout 代码吧!
应用扩展
为了在应用扩展中使用 PureLayout,您需要做一点额外的配置,以防止使用不可用的API。了解更多信息,请点击此处。
发布
发布在git提交历史中使用语义化版本控制进行标记。检查发布和发布说明以了解每个版本的详细信息。
API速查表
这只是一个核心API方法的手册概览。探索头文件以获取完整的API,并在相应的.m文件中找到每个方法的实现上方的完整文档。以下是一些备注
- 公共API方法都使用前缀
auto...
进行命名空间,这也使得Xcode在您键入时可以轻松完成自动填充。 - 创建约束的方法也会自动安装(激活)约束,然后返回新约束以便您可以任意存储以供以后调整或删除。
- 下面许多方法也有包含
relation:
参数的变体,以使约束成为一个不等式。
属性
PureLayout定义了用于创建自动布局约束的视图属性。这里可以看到最常见的属性图示。
有5种特定的属性类型,这些类型在大多数API中使用。
ALEdge
ALDimension
ALAxis
ALMargin
仅适用于iOS 8.0及以上版本ALMarginAxis
仅适用于iOS 8.0及以上版本
此外,还有一个通用的属性类型ALAttribute
,它是所有特定类型的一个并集。您可以将其视为所有特定属性类型的“超类型”,这意味着可以将特定类型安全地转换为通用的ALAttribute
类型。(请注意,反向操作是不安全的——将通用的ALAttribute转换为特定属性类型是不安全的!)
UIView
/NSView
- autoSetContent(CompressionResistance|Hugging)PriorityForAxis:
- autoCenterInSuperview(Margins) // Margins variant iOS 8.0+ only
- autoAlignAxisToSuperview(Margin)Axis: // Margin variant iOS 8.0+ only
- autoPinEdgeToSuperview(Edge:|Margin:)(withInset:) // Margin variant iOS 8.0+ only
- autoPinEdgesToSuperview(Edges|Margins)(WithInsets:)(excludingEdge:) // Margins variant iOS 8.0+ only
- autoPinEdge:toEdge:ofView:(withOffset:)
- autoAlignAxis:toSameAxisOfView:(withOffset:|withMultiplier:)
- autoMatchDimension:toDimension:ofView:(withOffset:|withMultiplier:)
- autoSetDimension(s)ToSize:
- autoConstrainAttribute:toAttribute:ofView:(withOffset:|withMultiplier:)
- autoPinTo(Top|Bottom)LayoutGuideOfViewController:withInset: // iOS only
- autoPinEdgeToSuperviewSafeArea: // iOS 11.0+ only
- autoPinEdgeToSuperviewSafeArea:withInset: // iOS 11.0+ only
NSArray
// Arrays of Constraints
- autoInstallConstraints
- autoRemoveConstraints
- autoIdentifyConstraints: // iOS 7.0+, OS X 10.9+ only
// Arrays of Views
- autoAlignViewsToEdge:
- autoAlignViewsToAxis:
- autoMatchViewsDimension:
- autoSetViewsDimension:toSize:
- autoSetViewsDimensionsToSize:
- autoDistributeViewsAlongAxis:alignedTo:withFixedSpacing:(insetSpacing:)(matchedSizes:)
- autoDistributeViewsAlongAxis:alignedTo:withFixedSize:(insetSpacing:)
NSLayoutConstraint
+ autoCreateAndInstallConstraints:
+ autoCreateConstraintsWithoutInstalling:
+ autoSetPriority:forConstraints:
+ autoSetIdentifier:forConstraints: // iOS 7.0+, OS X 10.9+ only
- autoIdentify: // iOS 7.0+, OS X 10.9+ only
- autoInstall
- autoRemove
使用说明
示例代码(Swift)
PureLayout极大地简化了编写自动布局代码的过程。让我们快速查看一些例子,使用Swift中的PureLayout。
使用PureLayout初始化器初始化视图
let view1 = UIView(forAutoLayout: ())
如果您需要使用不同的初始化器(例如在UIView
子类中),您也可以使用configureForAutoLayout
view1.configureForAutoLayout() // alternative to UIView.init(forAutoLayout: ())
以下是通过PureLayout创建并自动激活的两个视图之间的约束
view1.autoPinEdge(.top, toEdge: .bottom, ofView: view2)
没有PureLayout,以下是您需要直接使用Apple的Foundation API编写的等效代码
NSLayoutConstraint(item: view1, attribute: .top, relatedBy: .equal, toItem: view2, attribute: .bottom, multiplier: 1.0, constant: 0.0).active = true
PureLayout在底层为您创建多个约束,使您能够编写易于阅读的布局代码
// 2 constraints created & activated in one line!
logoImageView.autoCenterInSuperview()
// 4 constraints created & activated in one line!
textContentView.autoPinEdgesToSuperviewEdges(with insets: UIEdgeInsets(top: 20.0, left: 5.0, bottom: 10.0, right: 5.0))
PureLayout始终返回它创建的约束,以便您有完全的控制权
let constraint = skinnyView.autoMatchDimension(.height, toDimension: .width, ofView: tallView)
PureLayout从iOS 11.0+支持安全区域
view2.autoPinEdge(toSuperviewSafeArea: .top)
PureLayout支持所有自动布局功能,包括不等式、优先级、布局边距、标识符等等。它是使用自动布局的综合、面向开发者的方法。
请查看下面的示例应用程序,以查看PureLayout的更多使用示例。
示例应用
打开仓库中包含的项目(需要 Xcode 6 或更高版本)。它包含了在各种场景中使用的库的 iOS(Example-iOS
构建方案)和 OS X(Example-Mac
构建方案)示例。iOS 示例应用中的演示非常适合作为 PureLayout 的入门教程 -- 运行每个演示,查看实现它的代码,然后练习对示例代码进行一些修改:
每个 iOS 示例应用中的演示都有 Swift 和 Objective-C 版本。**要编译和运行 Swift 演示,您必须使用 Xcode 7.0 或更高版本(Swift 2.0)并选择 Example-iOS-Xcode7
构建方案**。运行示例应用时,您可以轻松地在 Swift 和 Objective-C 版本之间切换。要查看 iOS 演示中的约束效果,请尝试在不同的设备模拟器中运行,旋转设备以不同的方向,以及在 iOS 模拟器中切换内置为通话状态的更长的状态栏。
在 OS X 上,运行应用时按任意键可遍历演示。您可以调整窗口大小以查看约束效果。
技巧和技巧
查看一些技巧和技巧,在使用 API 的过程中需要注意。
PureLayout 与其他库的比较
实现自动布局的方法有很多。以下是对可用选项的简要概述:
- Apple NSLayoutConstraint SDK API
- 优点:原始动力强大
- 缺点:极端冗长;编写繁琐;难以阅读
- Apple 视觉格式语言
- 优点:简洁;方便
- 缺点:不支持某些用例;缺乏编译时检查和安全;必须学习语法;难以调试
- Apple 接口构建器
- 优点:可视化;交互式;提供编译时布局检查
- 缺点:对于复杂布局来说难以使用;无法在运行时动态设置约束;鼓励使用硬编码的魔法数字;不总是所见即所得
- Apple NSLayoutAnchor SDK API
- 优点:创建单个约束的清洁、可读和类型安全的 API
- 劣势:仅在iOS 9.0和OS X 10.11及以上版本中可用;需要手动激活每个约束;没有一次创建多个约束的API
- PureLayout
- 优点:与Objective-C和Swift代码库兼容;与Cocoa API风格一致;iOS和OS X跨平台API和实现共享;完全向后兼容iOS 6及OS X 10.7;易于使用;类型安全;高效
- 劣势:布局代码的表达方式并非最简洁的
- 高级Auto Layout库/DSL(Cartography,SnapKit,KeepLayout)
- 优点:非常清晰、简洁且方便
- 劣势:独特的API风格与苹果API不同;Objective-C & Swift的兼容性混合;对第三方代码的依赖性更大
PureLayout采取平衡的方法对待Auto Layout,使其非常适合任何项目。
问题、建议、Pull Requests?
如果遇到与PureLayout特定的问题,或有功能请求或想分享评论,请在此处打开新问题。请注意,一般Auto Layout问题应该在Stack Overflow上提出。
鼓励和非常欢迎Pull Requests!请尽量保持与现有代码风格的一致性。如果您正在考虑进行重大的更改或扩展,请事先通过打开新Issue进行沟通。这使每个人都能跟上即将发生的变化,确保更改与项目的设计哲学保持一致,并避免重复工作。
元数据
最初由Tyler Fox(@smileyborg)设计和构建。目前由Mickey Reiss(@mickeyreiss)维护。遵循MIT许可证分发。