Paralayout
Paralayout 是一套简单、实用且直观的工具,它能够实现 iOS 的像素级布局。您的设计师会爱上它。
入门
CocoaPods
要通过 CocoaPods 安装 Paralayout,请将以下内容添加到您的 Podfile
pod 'Paralayout'
Swift 包管理器
要通过 Swift 包管理器 安装 Paralayout,请将以下内容添加到您的 Package.swift
dependencies: [
.package(name: "Paralayout", url: "https://github.com/square/Paralayout.git", from: "1.0.0"),
]
Carthage
通过 Carthage 安装 Paralayout,将以下内容添加到您的 Cartfile
github "Square/Paralayout"
子模块
或者,使用 git submodule add [email protected]:Square/Paralayout.git
手动检出子模块,将 Paralayout.xcodeproj 拖拽到您的 workspace,并将 Paralayout 添加为构建依赖。
使用方法
Paralayout 是一组可供即点即用的工具集,您可以根据需要选择使用其中的功能。
UIView 子类:细线
细线
可以在任何屏幕分辨率上正确调整大小,并为在父视图中的定位提供便利。
/// Put a line at the bottom of the view, inset 20 points on each side.
let separator = Hairline.new(in: view, at: .maxYEdge, inset: 20)
新值类型:插值
轻松获得多阶段布局转换和动画的正确数学计算,无需费力!在内部,它只是一个介于0和1之间的值,但计算这个值以及从中导出新值却异常简单。
// Determine how far we are into the transition of collapsing the header.
let headerCollapseAmount = Interpolation(of: header.frame.height, from: maxHeaderHeight, to: minHeaderHeight)
// The icon shrinks to half its usual size...
let avatarSize = headerCollapseAmount.interpolate(from: 80, to: 40)
avatar.frame.size = CGSize(width: avatarSize, height: avatarSize)
// ...as it completely fades out.
avatar.alpha = headerCollapseAmount.interpolate(from: 1, to: 0)
新值类型:宽高比
从任何大小、矩形或宽/高值创建宽高比,并使用它计算像素精确的帧矩形。
videoPlayer.frame = AspectRatio.widescreen.rect(toFit: bounds, at: .topCenter, in: view)
CGGeometry 扩展
这些扩展提供了许多便利,用于计算矩形和将坐标选择到像素维度。ScaleFactorProviding
协议封装了后者,允许视图提供其子视图与像素对齐所需的环境。这种方法的一个好处是,单元测试可以涵盖2x和3x缩放因子,而不管使用什么模拟器运行测试。
UIFont 扩展
文本字段上方的“帽高”和下方“基线”之间的额外空间是确定的但不是显而易见的,尤其是在不同的缩放因子下。简单的LabelCapInsets
值类型封装了这种逻辑。
UIView 对齐扩展
核心定位函数(及其大量派生的便利函数)允许一个视图相对于另一个视图进行定位。
titleLabel.align(.leftCenter, with: icon, .rightCenter, horizontalOffset: 8)
icon.align(withSuperview: .topCenter, inset: 20)
UIView 尺寸扩展
这些方法扩展了 UIView.sizeThatFits(:)
和 UIView.sizeToFit()
,包括约束,这对于标签和其他相关宽度和高度的视图非常有用。
let labelSize = label.frameSize(thatFits: bounds.insetBy(dx: 20, dy: 20).size, constraints: [ .fixedWidth, .maxHeight ])
titleLabel.wrap(toFitWidth: boundsWidth, margins: 20)
UIView 分布扩展
使用固定和/或成比例的空间在水平或垂直方向上分配一组视图
/// Vertically stack an icon, header, and button, with twice as much space at the bottom as the top.
selectionScreen.applySubviewDistribution([ 1.flexible, headerIcon, 8.fixed, headerLabel, 1.flexible, button, 2.flexible])
/// Left-align a pair of labels, one above the other, with equal space above the title and below the subtext (despite the subtext being a smaller font).
cell.applySubviewDistribution([ 1.flexible, titleLabel, 8.fixed, subtextLabel, 1.flexible ], alignment: .leading(inset: 10))
/// Equally size a pair of buttons with a hairline divider between them, and size/position them at the bottom of the alert.
alert.spreadOutSubviews([ cancelButton, acceptButton ], axis: .horizontal, margin: alert.hairlineWidth, inRect: alert.bounds.slice(from: .maxYEdge, amount: buttonHeight))
调试
修复布局问题就像使用 Xcode 调试器一样简单。请记住,在 2x 设备上,视图框架坐标将被捕捉到半点边界(只有 x.0
和 x.5
),而在 3x 设备上它们是在 1/3 点边界上(x.0
、x.333
和 x.667
)。用于视图对齐的偏移量不需要舍入(通常也不应该,以免累积舍入误差),但视图的大小应该。
要求
- iOS 12.0 或更高版本
- Xcode 12.0 或更高版本
- Swift 5.0
贡献
我们很高兴你对 Paralayout 表示兴趣,并且我们很乐意看到你能把它带到哪里。在提交拉取请求之前,请阅读我们的贡献指南。