Paralayout 1.0.0

Paralayout 1.0.0

Peter WestenNick EntinNick Entin维护。



  • Square

Paralayout

CI Status Carthage Compatibility Version License Platform

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.0x.5),而在 3x 设备上它们是在 1/3 点边界上(x.0x.333x.667)。用于视图对齐的偏移量不需要舍入(通常也不应该,以免累积舍入误差),但视图的大小应该。


要求

  • iOS 12.0 或更高版本
  • Xcode 12.0 或更高版本
  • Swift 5.0

贡献

我们很高兴你对 Paralayout 表示兴趣,并且我们很乐意看到你能把它带到哪里。在提交拉取请求之前,请阅读我们的贡献指南