DynamicButtonStack 1.1.5

DynamicButtonStack 1.1.5

Douglas Hill 维护。



  • 作者:
  • Douglas Hill

DynamicButtonStack

DynamicButtonStack 可以将一组按钮排列在列或行。它可以根据按钮内容和可用空间动态调整布局。

了解更多关于 DynamicButtonStack 解决的问题以及其背后的设计原则。

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

需求

  • DynamicButtonStack 需要 iOS 13(在旧版本中,一些情况下 UIButton 对 imageEdgeInsets 的响应略有不同)。
  • 预期使用最新稳定的 Xcode 版本。
  • 与 Swift 和 Objective-C 应用兼容。

安装

推荐

  1. 克隆此仓库。
  2. DynamicButtonStack.swift 拖动到您的 Xcode 项目中并将其添加到您的目标中。

Swift包管理器

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

  1. 从文件菜单中选择Swift Packages > 添加包依赖...
  2. 将“https://github.com/douglashill/DynamicButtonStack”作为包仓库URL输入。

CocoaPods

  1. 在你的Podfile中添加以下内容

    pod 'DynamicButtonStack'
  2. 运行以下命令

    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)

按钮堆栈可以使用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)
}

按钮可以根据你的喜好进行样式设置。颜色、字体、阴影、高亮状态等。

  • 设置两个图像和标题。
  • 不要修改imageEdgeInsetstitleEdgeInsets,因为DynamicButtonStack需要调整这些以设置按钮内的堆叠和对齐。
  • 根据你的喜好自定义任何其他属性。设置contentEdgeInsets是推荐的。

状态

DynamicButtonStack 已认为可用于生产。

↔️兼容左到右和右到左布局。

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

问答

DynamicButtonStack 是否使用了现代布局 API,如约束、UIStackView 或 SwiftUI?

😄不。

使用 SwiftUI 是否会更容易?

🤷‍♂️可能。如果你这样认为,我很想看看它是如何的样子。

致谢

DynamicButtonStack 是 Douglas Hill 的项目,该项目是为我的 阅读应用 开发的。

许可

MIT 许可证 — 请参阅 License.txt