Grid
Skip support for SwiftUI.Grid ↗.
The following example screens and source code is from SkipUI’s
Showcase sample app
GridPlayground.swift ↗
import SwiftUI
struct GridPlayground: View { var body: some View { ScrollView { VStack(spacing: 16) { NavigationLink("LazyVGrid .adaptive") { LazyVGridAdaptiveView() .navigationTitle("LazyVGridView") } NavigationLink("LazyVGrid .flexible") { LazyVGridFlexibleView() .navigationTitle("LazyVGridView") } NavigationLink("LazyVGrid .fixed") { LazyVGridFixedView() .navigationTitle("LazyVGridView") } NavigationLink("LazyVGrid .trailing") { LazyVGridTrailingView() .navigationTitle("LazyVGridView") } NavigationLink("LazyVGrid sectioned") { LazyVGridSectionedView() .navigationTitle("LazyVGridView") } NavigationLink("LazyVGrid refreshable") { LazyVGridRefreshableView() .navigationTitle("Refreshable") } NavigationLink("LazyHGrid .adaptive") { LazyHGridAdaptiveView() .navigationTitle("LazyHGridView") } NavigationLink("LazyHGrid .flexible") { LazyHGridFlexibleView() .navigationTitle("LazyHGridView") } NavigationLink("LazyHGrid .fixed") { LazyHGridFixedView() .navigationTitle("LazyHGridView") } NavigationLink("LazyHGrid .bottom") { LazyHGridBottomView() .navigationTitle("LazyHGridView") } NavigationLink("LazyHGrid sectioned") { LazyHGridSectionedView() .navigationTitle("LazyHGridView") } NavigationLink("LazyVGrid .padding") { LazyVGridPaddingView() .navigationTitle("LazyVGridView") } } .padding() } .toolbar { PlaygroundSourceLink(file: "GridPlayground.swift") } }}
private struct LazyVGridAdaptiveView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) } } } }}
private struct LazyVGridFlexibleView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())]) { ForEach(0..<50) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) ZStack { Color.green Text(String(describing: index)) } .frame(height: 80) } } } }}
private struct LazyVGridFixedView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.fixed(80)), GridItem(.fixed(80)), GridItem(.fixed(80)), GridItem(.fixed(80))]) { ForEach(0..<25) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) ZStack { Color.green Text(String(describing: index)) } .frame(height: 80) ZStack { Color.pink Text(String(describing: index)) } .frame(height: 80) ZStack { Color.orange Text(String(describing: index)) } .frame(height: 80) } } } }}
private struct LazyVGridTrailingView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80), alignment: .trailing)]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 40, height: 40) } } } }}
private struct LazyVGridSectionedView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<5) { index in Section { ForEach(0..<10) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) } } header: { Text("Section \(index) Header") } footer: { Text("Section footer") } } } } }}
private struct LazyVGridRefreshableView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) } } } .refreshable { do { try await Task.sleep(nanoseconds: 3_000_000_000) } catch { } } }}
private struct LazyHGridAdaptiveView: View { var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 80) } } } }}
private struct LazyHGridFlexibleView: View { var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())]) { ForEach(0..<50) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 80) ZStack { Color.green Text(String(describing: index)) } .frame(width: 80) } } } }}
private struct LazyHGridFixedView: View { var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: [GridItem(.fixed(80)), GridItem(.fixed(80)), GridItem(.fixed(80)), GridItem(.fixed(80))]) { ForEach(0..<25) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 80) ZStack { Color.green Text(String(describing: index)) } .frame(width: 80) ZStack { Color.pink Text(String(describing: index)) } .frame(width: 80) ZStack { Color.orange Text(String(describing: index)) } .frame(width: 80) } } .frame(height: 400) } }}
private struct LazyHGridBottomView: View { var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: [GridItem(.adaptive(minimum: 80), alignment: .bottom)]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 40, height: 40) } } } }}
private struct LazyHGridSectionedView: View { var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<5) { index in Section { ForEach(0..<10) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(width: 80) } } header: { Text("Section \(index) Header") } footer: { Text("Section footer") } } } } }}
private struct LazyVGridPaddingView: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))]) { ForEach(0..<100) { index in ZStack { Color.yellow Text(String(describing: index)) } .frame(height: 80) } } .padding(32) } }}