How to create a custom list in SwiftUI
Lists
A SwiftUI List looks pretty similar to the Settings page in your iPhone. So, whenever you create a List in SwiftUI, that is how your lists will turn out by default.

Create the project
Let’s create a custom SwiftUI List to add some creativity.
To begin, create a SwiftUI Xcode project, and create a struct, namely, Data.
struct Data: Identifiable {
let id = UUID()
var name: String
var age: Int
var gender: String
}
Let’s get back in our ContentView.swift and populate some values into this struct.
private let values: [Data] = [
Data(name: "John", age: 24, gender: "Male"),
Data(name: "Katherine", age: 25, gender: "Female"),
Data(name: "Jonas", age: 21, gender: "Male")
]
Now, inside your view, create a List, and use ForEach to add and see all your data in list form.
var body: some View {
List {
ForEach(values){ item in
Text(item.name)
}
}
}
This is how your canvas will now look:
This the default SwiftUI List, just like we saw for the Settings page.
Now, let’s create a custom List.
Custom Lists
-
Create a new SwiftUI file, namely
Design. -
Now create a
RoundedRectangle, with acornerRadiusof10.0, and give it abluecolor. Also, embed the same in a ZStack, such that we can add our text on top of it later.
ZStack{
RoundedRectangle(cornerRadius: 10.0)
.fill(Color.blue)
.frame(height: 100)
}
- Now let’s add a little
Textand a fewalignmentsto make our list look prettier.
ZStack(alignment: .leading){
RoundedRectangle(cornerRadius: 10.0)
.fill(Color.blue)
.frame(height: 100)
VStack(alignment: .leading){
Text("John")
.foregroundColor(.white)
.font(.title)
Text("21")
.foregroundColor(.white)
.font(.title2)
Text("Male")
.foregroundColor(.white)
.font(.title2)
}
.padding()
}
.padding()
- Your view should now look like this:

- Now, back in your
Content.swift, replace yourTextandListwith theDesignfile.
var body: some View {
VStack {
ForEach(values){ item in
DesignView()
}
}
}
- Now your canvas will look like this:

-
However, our canvas feels a little weird, because it does not show the actual value from the
Data. So, let’s parse some data into our view. -
Back in our
DesignView, let’s create three variables,username,age, andgender, and link up the values to the view.
struct DesignView: View {
@State var name: String
@State var age: Int
@State var gender: String
var body: some View {
ZStack(alignment: .leading){
RoundedRectangle(cornerRadius: 10.0)
.fill(Color.blue)
.frame(height: 100)
VStack(alignment: .leading){
Text(name)
.foregroundColor(.white)
.font(.title)
Text("\(age)")
.foregroundColor(.white)
.font(.title2)
Text(gender)
.foregroundColor(.white)
.font(.title2)
}
.padding()
}
.padding()
}
}
struct DesignView_Previews: PreviewProvider {
static var previews: some View {
DesignView(name: "John", age: 21, gender: "Male")
}
}
- Back in our ContentView, link up the
name,age, andgenderwith the actual data value.
VStack {
ForEach(values){ item in
DesignView(name: item.name, age: item.age, gender: item.gender)
}
}
- Now, our custom list should show the values passed from the actual data.

That’s it! You can edit and style your custom list however you want; you can add a few images, symbols, colors, and whatnot to make your list look beautiful.