DynamicButtonStack
DynamicButtonStack 可以将一组按钮排列在列或行。它可以根据按钮内容和可用空间动态调整布局。
了解更多关于 DynamicButtonStack 解决的问题以及其背后的设计原则。
需求
- DynamicButtonStack 需要 iOS 13(在旧版本中,一些情况下 UIButton 对 imageEdgeInsets 的响应略有不同)。
- 预期使用最新稳定的 Xcode 版本。
- 与 Swift 和 Objective-C 应用兼容。
安装
推荐
- 克隆此仓库。
- 将
DynamicButtonStack.swift
拖动到您的 Xcode 项目中并将其添加到您的目标中。
Swift包管理器
将DynamicButtonStack添加到现有Xcode项目中作为包依赖项
- 从文件菜单中选择Swift Packages > 添加包依赖...
- 将“https://github.com/douglashill/DynamicButtonStack”作为包仓库URL输入。
CocoaPods
-
在你的
Podfile
中添加以下内容pod 'DynamicButtonStack'
-
运行以下命令
pod install
使用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,如约束、UIStackView 或 SwiftUI?
使用 SwiftUI 是否会更容易?
致谢
DynamicButtonStack 是 Douglas Hill 的项目,该项目是为我的 阅读应用 开发的。
许可
MIT 许可证 — 请参阅 License.txt