SwiftUI wrapping stack implementation using Layout protocol (iOS 16+)

FlowStackLayout

FlowStack acts like a HStack until there are no more space for new cells, then FlowStack will wrap to the next row

FlowStack supports vertical and horizontal alignment

Horizontal alignment will align rows

Vertical alignment will align cells based on row height

FlowStackLayout conforms to Layout protocol, while FlowStack conforms to View and wraps FlowStackLayout

View modifiers can’t be used with Layout protocol, so FlowStack is preferred for normal use

FlowStack(alignment: Alignment = .center, horizontalSpacing: Double? = nil, verticalSpacing: Double? = nil, content: @escaping () -> Content)

FlowStack {
    ForEach(0...20, id: \.self) {
        Text(String($0))
            .foregroundColor(Color(uiColor: .systemBackground))
            .padding([.leading, .trailing])
            .frame(height: 30)
            .background {
                Capsule()
                    .fill(.mint)
            }
    }
}

FlowStackLayout(alignment: Alignment = .center, horizontalSpacing: Double? = nil, verticalSpacing: Double? = nil)

let layout = isVertical ? AnyLayout(VStack()) : AnyLayout(FlowStackLayout())

layout {
  
}

Installation

Swift Package Manager

https://github.com/smyshlaevalex/FlowStackLayout.git

GitHub

View Github