SwiftUI’s List
view is a great way to show scrolling rows of data, but sometimes you also want columns of data – a grid of information, that is able to adapt to show more data on larger screens.
In SwiftUI this is accomplished with two views: LazyHGrid
for showing horizontal data, and LazyVGrid
for showing vertical data. Just like with lazy stacks, the “lazy” part of the name is there because SwiftUI will automatically delay loading the views it contains until the moment they are needed, meaning that we can display more data without chewing through a lot of system resources.
Creating a grid is done in two steps. First, we need to define the rows or columns we want – we only define one of the two, depending on which kind of grid we want.
For example, if we have a vertically scrolling grid then we might say we want our data laid out in three columns exactly 80 points wide by adding this property to our view:
let layout = [
GridItem(.fixed(80)),
GridItem(.fixed(80)),
GridItem(.fixed(80))
]
Once you have your layout defined, you should place your grid inside a ScrollView
, along with as many items as you want. Each item you create inside the grid is automatically assigned a column in the same way that rows inside a list automatically get placed inside their parent.
For example, we could render 1000 items inside our three-column grid like this:
ScrollView {
LazyVGrid(columns: layout) {
ForEach(0..<1000) {
Text("Item \($0)")
}
}
}
That works for some situations, but the best part of grids is their ability to work across a variety of screen sizes. This can be done with a different column layout using adaptive sizes, like this:
let layout = [
GridItem(.adaptive(minimum: 80)),
]
That tells SwiftUI we’re happy to fit in as many columns as possible, as long as they are at least 80 points in width. You can also specify a maximum range for even more control:
let layout = [
GridItem(.adaptive(minimum: 80, maximum: 120)),
]
I tend to rely on these adaptive layouts the most, because they allow grids that make maximum use of available screen space.
Before we’re done, I want to briefly show you how to make horizontal grids. The process is almost identical, you just need to make your ScrollView
work horizontally, then create a LazyHGrid
using rows rather than columns:
ScrollView(.horizontal) {
LazyHGrid(rows: layout) {
ForEach(0..<1000) {
Text("Item \($0)")
}
}
}
That brings us to the end of the overview for this project, so please go ahead and reset ContentView.swift to its original state.
SPONSORED Take the pain out of configuring and testing your paywalls. RevenueCat's Paywalls allow you to remotely configure and A/B test your entire paywall UI without any code changes or app updates.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.