Mar 09, 2023 iOS

SwiftUI CollectionView using Vgrid

A native collection view wasn’t included in SwiftUI’s CollectionView original release. Using third party libraries or creating your own solution are also options. Apple unveiled a tonne of new SwiftUI framework capabilities at this year’s WWDC. One of them is to deal with the need for grid view implementation. LazyVGrid and LazyHGrid are two additional UI components that SwiftUI now offers to developers.

I’ll show you how to construct both horizontal and vertical views in this lesson. The versatile designs of LazyVGrid and LazyHGrid enable programmers to quickly build a variety of grid layouts. In order to create alternative layouts, we will also investigate this and discover how to change the size of grid components.

SwiftUI doesn’t have a built-in CollectionView component like UIKit, but you can achieve similar functionality by using the LazyVGrid or LazyHGrid views along with the ForEach view.

Here’s an example of how you can create a collection view-like layout with LazyVGrid:

struct ContentView: View {
    let items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10"]
    
    let columns = [
        GridItem(.flexible()),
        GridItem(.flexible()),
        GridItem(.flexible())
    ]
    
    var body: some View {
        ScrollView {
            LazyVGrid(columns: columns, spacing: 20) {
                ForEach(items, id: \.self) { item in
                    Text(item)
                        .frame(maxWidth: .infinity)
                        .frame(height: 100)
                        .background(Color.blue)
                }
            }
            .padding()
        }
    }
}

In this example, we define an array of items and a grid layout with three columns using GridItem(.flexible()). Then we use LazyVGrid to create the grid layout, and ForEach to iterate through the items and create a Text view for each item. We set the id parameter of ForEach to \.self to ensure that each item is uniquely identified.

Note that we also set the frame of each Text view to maxWidth: .infinity to make sure it fills the available space in its column. We also set the height of the Text view to a fixed value and give it a blue background to make it stand out.

You can customize the LazyVGrid and LazyHGrid views to achieve different layouts and column configurations.

SwiftUI CollectionView Using ScrollView with VStack and HStack

You can use ScrollView with VStack and HStack to create scrolling views in SwiftUI. Here’s an example of how to use them together:

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack {
                ForEach(0..<10) { index in
                    HStack {
                        ForEach(0..<10) { index in
                            Text("\(index)")
                                .padding()
                        }
                    }
                }
            }
        }
    }
}

In this example, we create a ScrollView that contains a VStack. Inside the VStack, we use a ForEach loop to create 10 rows of HStacks. Each HStack contains 10 Text views, each displaying a number.

Note that we add padding() to the Text views to give them some breathing room and make them easier to read. You can customize the amount of padding by passing a value to the padding() function.

You can also use ScrollView with other layout views like ZStack or LazyVStack and LazyHStack for more complex layouts. The principles are the same, you just need to make sure the content inside the scroll view is contained within a single view, and that view is the direct child of the ScrollView.

SwiftUI CollectionView Using ScrollView with LazyHGrid or LazyVGrid

use ScrollView with LazyHGrid and LazyVGrid to create scrolling views with grid layouts in SwiftUI. Here’s an example of how to use them together:

struct ContentView: View {
    let columns = [
        GridItem(.flexible()),
        GridItem(.flexible())
    ]
    
    var body: some View {
        ScrollView {
            LazyVGrid(columns: columns) {
                ForEach(0..<20) { index in
                    Text("\(index)")
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                        .background(Color.blue)
                }
            }
            .padding()
        }
    }
}

In this example, we create a ScrollView that contains a LazyVGrid. The LazyVGrid has two flexible columns defined in the columns array. Inside the LazyVGrid, we use a ForEach loop to create 20 Text views, each displaying a number.

Note that we set the frame of each Text view to maxWidth: .infinity and maxHeight: .infinity to make them fill the available space in the grid cells. We also give each Text view a blue background to make it stand out.

You can customize the number of columns and the layout of the grid by modifying the columns array and the parameters passed to LazyVGrid or LazyHGrid.

Keep in mind that when using ScrollView with a grid layout, the grid cells need to have a fixed size. Otherwise, the cells may not line up correctly and the layout can become unpredictable. To ensure a consistent layout, you can use frame to set a fixed size for each cell in the grid.

Index