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