DynamicButtonStack

DynamicButtonStack 以纵向(列)或横向(行)方式排列一组按钮。它可以动态调整布局,以适应按钮内容和可用空间。

请阅读这篇博文,详细了解 DynamicButtonStack 解决的问题及其背后的设计原则。

Composite screenshot of DynamicButtonStack in various languages. Chinese, English, German, Arabic.

要求

安装

直接安装

  1. 克隆此存储库或从 GitHub 下载 DynamicButtonStack.swift
  2. 将此文件拖到您的 Xcode 项目中,并在出现提示时选择将其添加到您的目标。

Swift Package Manager

将 DynamicButtonStack 作为包依赖项添加到现有的 Xcode 项目中

  1. 从“文件”菜单中,选择“Swift Packages › Add Package Dependency…”(Swift 包 › 添加包依赖项…)。
  2. 输入 https://github.com/douglashill/DynamicButtonStack 作为包存储库 URL。

CocoaPods

DynamicButtonStack 在 CocoaPods 上可用,名称为 DynamicButtonStack。使用 CocoaPods 时的模块名称为 DynamicButtonStackKit

用法

您的应用向 DynamicButtonStack 提供按钮和一个最大宽度。 然后,DynamicButtonStack 为您的应用提供所需的最小宽度和高度。 您的应用然后为 DynamicButtonStack 提供至少该数量的空间,按钮将整齐地堆叠在该空间内。

您可以提供任意数量的按钮。 它们的标题可以任意长,字体可以任意大。 作为交换,请为按钮堆栈提供它所需的高度。 因此,按钮堆栈通常最好放置在垂直滚动视图中。

创建一个 DynamicButtonStack,并为其提供一个按钮数组,每个按钮都包含图像和标题。 将按钮堆栈添加到您的视图层次结构中。

let button = UIButton()
button.setImage(UIImage(systemName: "paperplane"), for: .normal)
button.setTitle("Send", for: .normal)

buttonStack = DynamicButtonStack(buttons: [
    button,
])

view.addSubview(buttonStack)

可以使用 sizeThatFitslayoutSubviews 或使用约束来布局按钮堆栈。

使用约束时,堆栈将其垂直抗压缩优先级设置为必需,否则按钮可能会被裁剪。 通常应提供宽度约束。

使用 layoutSubviews 时,应将帧设置为至少与从 sizeThatFits 返回的大小一样大(在两个维度上)。 使用 sizeThatFits 测量最小尺寸。 传递容器的宽度限制和无限的高度。 如果高度不是无限的,则断言将失败。 这提醒我们目前不支持处理受限高度。

override func layoutSubviews() {
    super.layoutSubviews()
    
    let availableSize = CGSize(width: bounds.width, height: .greatestFiniteMagnitude)
    let requiredSize = buttonStack.sizeThatFits(availableSize)
    buttonStack.frame = CGRect(origin: .zero, size: requiredSize)
}

可以随意设置按钮的样式。 颜色、字体、阴影、高亮状态等。

状态

✅ DynamicButtonStack 被认为已准备好在生产环境中使用。

↔️同时支持从左到右和从右到左的布局。

😇 没有私有 API 使用或对私有子视图的干扰。

问答

开发应该使用哪个 Scheme?

Xcode 项目中有两个相同的 Scheme,目的是鼓励 Swift Package Index 构建 Swift 包,而不是尝试构建演示应用。 因此,使用哪个 Scheme 进行开发没有区别。

致谢

DynamicButtonStack 是 Douglas Hill 的一个项目,并为我的阅读应用程序开发。

许可证

MIT 许可证 — 请参阅 License.txt