DynamicButtonStack 以纵向(列)或横向(行)方式排列一组按钮。它可以动态调整布局,以适应按钮内容和可用空间。
请阅读这篇博文,详细了解 DynamicButtonStack 解决的问题及其背后的设计原则。
DynamicButtonStack.swift
。将 DynamicButtonStack 作为包依赖项添加到现有的 Xcode 项目中
https://github.com/douglashill/DynamicButtonStack
作为包存储库 URL。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)
可以使用 sizeThatFits
和 layoutSubviews
或使用约束来布局按钮堆栈。
使用约束时,堆栈将其垂直抗压缩优先级设置为必需,否则按钮可能会被裁剪。 通常应提供宽度约束。
使用 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)
}
可以随意设置按钮的样式。 颜色、字体、阴影、高亮状态等。
imageEdgeInsets
或 titleEdgeInsets
,因为 DynamicButtonStack 需要调整这些以设置按钮内部的堆叠和对齐。contentEdgeInsets
。✅ DynamicButtonStack 被认为已准备好在生产环境中使用。
😇 没有私有 API 使用或对私有子视图的干扰。
Xcode 项目中有两个相同的 Scheme,目的是鼓励 Swift Package Index 构建 Swift 包,而不是尝试构建演示应用。 因此,使用哪个 Scheme 进行开发没有区别。
DynamicButtonStack 是 Douglas Hill 的一个项目,并为我的阅读应用程序开发。
MIT 许可证 — 请参阅 License.txt