PinStackView 0.5.20240217

PinStackView 0.5.20240217

PinStackView 维护。



PinStackView 0.5.20240217

  • lalawue

简介

PinStackView 是一个基于 Frame 的 StackView,依赖于 PinLayout

功能

  • 可以与手动布局、Autolayout 一起使用
  • 是一个真实视图,仅对指定的子视图进行布局
  • 具有内部填充
  • 具有与 UIStackView 相似的等分布
  • 在轴方向上具有动态长度的自动样式
  • 具有增长/收缩功能
  • 观察项目布局属性
  • 对子视图的 'isHidden' 属性进行 KVO

安装

使用 CocoaPods 将 PinStackView 集成到您的 Xcode 项目中,在 Podfile 中指定它

    pod 'PinStackView'

然后,运行 pod install

使用方法

在 'Views/' 组中列出的项目示例

$ cd Example
$ pod install
$ open Example.xcworkspace

PinStackView

接口

  • addItems(): 添加托管的子视图,返回 PinStackItemInfo 以进行链式设置,您可以自行添加 subViews() 和布局视图
  • insertItem(): 与 addItems() 类似,可以定义顺序
  • removeItem(): 删除托管子视图,也从子视图中删除
  • remakeItem(): 用新项目替换但不更改子视图的顺序
  • itemForView(): 在 addItem() 或 insertItem() 之后从 PinStackView 获取 PinStackItemInfo
  • define(): 链式定义项信息的语法糖
  • markDirty(): 如同 setNeedsLayout(),强制在下一个视图更新中进行布局
  • triggerNeedsLayout(): 当 PinStackView setNeedsLayout 时触发子视图的 setNeedsLayout

属性

  • style: 默认 .fixed,布局后轴长度不变;.auto 样式表示其轴长度会根据项目变化
  • axis: .horizontal 或 .vertical 方向,动态长度方向
  • distribution: 轴方向布局样式,.equal 只支持 .fixed 样式;.auto 样式总是 .start
  • alignment: 轴方向的对齐,您可以使用 alignSelf() 指定视图的对齐方式
  • spacing: 轴方向上项目之间的间距
  • padding: 项目将在填充之后布局
  • layoutCallback: 每次布局后调用,在大小改变时会传入 true

PinStackItemInfo

PinStackItemInfo 是每个项目的布局定义,您可以在 addItem() 后获取其实例

  • top(): 上边距,像素或内边距后的高度比例
  • bottom(): 下边距,像素或内边距后的高度比例
  • left(): 左边距,像素或内边距后的宽度比例
  • right(): 右边距,像素或内边距后的宽度比例
  • width(): 像素或内边距后的宽度比例
  • height(): 像素或内边距后的高度比例
  • maxWidth(): 最大像素或内边距后的宽度比例,比 width() 优先级高
  • maxHeight(): 最大像素或内边距后的高度比例,比 height() 优先级高
  • minWidth(): 最小像素或内边距后的宽度比例,比 width() 优先级高
  • minHeight(): 最小像素或内边距后的高度比例,比 height() 优先级高
  • size(): 优先级高于 width(),height(),max/min width & height,像素或内边距后的比例
  • alignSelf(): 优先级高于 PinStackView 的对齐方式,仅适用于此项目
  • grow(): 在 .fixed 风格和 .start / .end 分配中,表示项目在所有固定项目长度累计后使用轴方向上的动态长度;在 .equal 分配或 .auto 风格中没有意义
  • shrink(): 在 .fixed 风格和.start / .end 分配中,表示项目在所有固定项目长度累计后使用轴方向上的动态长度;在 .equal 分配或 .auto 风格中没有意义

编码示例

使用来自 Suyeol Jeon 的 Then

    lazy var stackView = PinStackView().then {
        $0.style = .auto
        $0.axis = .horizontal
        $0.alignment = .center
        $0.distribution = .start
        $0.spacing = 10
        $0.addItem(v1).left(20)
        $0.addItem(v2).size(20).shrik(2.0)
        $0.addItem(v3).grow(1.0) // with grow ratio 1.0 / (1.0 + 2.0)
        $0.addItem(v4).size(30).grow(2.0).right(20)
    }

演示

Simulator.Screen.Recording.-.iPhone.14.Pro.Max.-.2023-03-05.at.13.47.23.mp4