Crafting a Stunning Photo Album using MosaicGrid

Nayanda Haberty
Nerd For Tech
Published in
5 min readFeb 15, 2024

Are you eager to enhance your app’s grid layouts? Look no further — MosaicGrid is here to assist you! In this guide, we’ll explore the process of creating an engaging photo album view using MosaicGrid in SwiftUI.

Introducing MosaicGrid

MosaicGrid offers many features, ranging from flexibility to customization, all neatly packaged together. While SwiftUI provides basic grid layout capabilities, MosaicGrid goes further with its advantages.

MosaicGrid offers flexibility and customization in grid layout design. Unlike SwiftUI’s default grid, MosaicGrid allows for custom arrangement of views inside grids, providing complete control over positioning, sizing, and row/column configuration. Whether you’re designing a photo album, a product catalog, or a social media feed, MosaicGrid empowers you to tailor the grid behavior to suit your specific needs, ensuring that your layout is perfectly tailored to your content.

Crafting Your Photo Album View

Now that we’ve highlighted the advantages of MosaicGrid, let’s put it into action by creating a stunning photo album view using MosaicGrid in SwiftUI.

Step 1: Initial Setup

Before we embark on our design journey, let’s ensure our Xcode project is ready. Adding MosaicGrid to your project is straightforward, whether you prefer CocoaPods or Swift Package Manager. Once installed, simply import MosaicGrid to get started:

import SwiftUI
import MosaicGrid

struct PhotoAlbumView: View {
var body: some View {
Text("Hello World")
}
}

#Preview {
PhotoAlbumView()
}

Step 2: Loading Images Dynamically

Let’s simplify the process of creating AsyncImage instances using a URL string with a method:

func image(from url: String) -> some View {
AsyncImage(url: URL(string: url)) { image in
image.resizable()
.scaledToFit()
.clipped()
} placeholder: {
Rectangle()
.foregroundColor(.gray)
}
}

Step 3: Designing the Grid Layout

With MosaicGrid’s VMosaicGrid, setting up a vertical grid layout is a breeze, providing the ideal canvas for showcasing our images. Let’s create a scrollable photo album with a grid size of 3 and a spacing of 2:

struct PhotoAlbumView: View {
var body: some View {
ScrollView(.vertical) {
VMosaicGrid(hGridCount: 3, spacing: 2) {
// Grid content will be placed here
}
}
}

// Another code here
}

Here’s how you can add three images to the body using the Picsum URL for dummy images:

struct PhotoAlbumView: View {
var body: some View {
ScrollView(.vertical) {
VMosaicGrid(hGridCount: 3, spacing: 2) {
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
}
}
}

// Another code here
}

Let’s preview our photo album view to see how our grid layout looks with the added images:

3 images, each using 1 grid

As you can see here, the MosaicGrid divides the view into three parts, with each part spaced by 2 units.

Let’s add more images using ForEach :

struct PhotoAlbumView: View {
var body: some View {
ScrollView(.vertical) {
VMosaicGrid(hGridCount: 3, spacing: 2) {
ForEach(0..<10) { _ in
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
}
}
}
}

// Another code here
}

Now, with a total of 30 images, the photo album view is scrollable and presents a visually appealing grid layout. In portrait orientation, the view extends vertically, allowing users to scroll through the collection of images seamlessly:

30 images, each using 1 grid

Step 4: Embrace Customization

Let’s dive into customizing image sizing by utilizing the tileSized modifier. This powerful feature allows us to specify the grid size for each image, enabling more precise control over the layout. In this step, we’ll adjust the second image to utilize a 2x2 grid size, enhancing its prominence within the grid layout:

struct PhotoAlbumView: View {
var body: some View {
ScrollView(.vertical) {
VMosaicGrid(hGridCount: 3, spacing: 2) {
ForEach(0..<10) { _ in
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/200")
.tileSized(w: 2, h: 2)
image(from: "https://picsum.photos/100")
}
}
}
}

// Another code here
}
30 images, some use 2x2 grids

As you can observe, with the introduction of the tileSized modifier, the second image will occupy a 2x2 grid size, effectively filling two adjacent grid spaces including 2 grids below. Subsequently, the third image will be positioned below the first image, attempting to fill any available empty grid space. This pattern repeats for each subsequent image until all views are loaded, resulting in a harmonious grid layout.

Let’s get creative! We have the flexibility to customize the view size as much as needed, as long as the assigned grids fit. In this step, we’ll add more images with customized grid sizes, including 2x1 and 1x2 configurations, to further enhance the visual diversity of our grid layout:

struct PhotoAlbumView: View {
var body: some View {
ScrollView(.vertical) {
VMosaicGrid(hGridCount: 3, spacing: 2) {
ForEach(0..<10) { _ in
image(from: "https://picsum.photos/200")
.tileSized(w: 2, h: 2)
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100/200")
.tileSized(w: 1, h: 2)
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/200")
.tileSized(w: 2, h: 2)
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/100")
image(from: "https://picsum.photos/200/100")
.tileSized(w: 2, h: 1)
}
}
}
}

// Another code here
}

And these custom grid configurations will be reflected in the preview, showcasing the dynamic and visually engaging layout created by MosaicGrid:

Viola!

Conclusion

And there you have it — a comprehensive guide to crafting captivating grid layouts with MosaicGrid in SwiftUI! Whether you’re showcasing a photo album, a product catalog, or a social media feed, MosaicGrid empowers you to create visually stunning layouts with ease. Head over to the MosaicGrid GitHub repository for more documentation!

--

--

Nayanda Haberty
Nerd For Tech

I love programming and learning. Expert in iOS, but also did Android, Backend, and Web Dev. Programming is fun and I enjoy exploring different tech stacks.