Skip to content
DeveloperMemos

Creating a Custom Modifier in SwiftUI

SwiftUI, Modifiers, Custom Modifier1 min read

Modifiers in SwiftUI are a powerful way to modify the appearance and behavior of a view. SwiftUI provides a set of built-in modifiers such as .foregroundColor, .font, and .padding. However, you may find yourself needing a modifier that is not available in the standard library. In such cases, you can create your own custom modifier. In this post, we will learn how to create a custom modifier in SwiftUI.

Anatomy of a Modifier

Before we dive into creating a custom modifier, let's understand the anatomy of a modifier. A modifier is a function that takes a view as an input and returns a modified version of that view. Here's a simple example of a modifier that adds a red border to a view:

1struct RedBorder: ViewModifier {
2 func body(content: Content) -> some View {
3 content.border(Color.red)
4 }
5}

In the above example, RedBorder is a struct that conforms to the ViewModifier protocol. The ViewModifier protocol requires the implementation of a single method called body, which takes a Content view as an input and returns a modified version of that view.

In the implementation of the body method, we use the border modifier to add a red border to the content view, which is the view that we want to modify. Finally, we return the modified view.

Using a Custom Modifier

Once you have defined a custom modifier, you can use it in your views just like any other modifier. Here's an example of using the RedBorder modifier that we defined earlier:

1struct ContentView: View {
2 var body: some View {
3 Text("Hello, World!")
4 .modifier(RedBorder())
5 }
6}

In the above example, we apply the RedBorder modifier to a Text view. This adds a red border around the text.

Creating a Custom Modifier with Parameters

In some cases, you may want to create a custom modifier that takes parameters. For example, you may want to create a modifier that adds a border with a specific color and width. Here's an example of a modifier that takes two parameters, color and width, and adds a border to a view with the specified color and width:

1struct ColoredBorder: ViewModifier {
2 let color: Color
3 let width: CGFloat
4
5 func body(content: Content) -> some View {
6 content.border(color, width: width)
7 }
8}

In the above example, ColoredBorder takes two parameters, color and width, which are used to create a border around the content view. We use the border modifier to create the border and pass in the color and width parameters. Finally, we return the modified view.

You can use the ColoredBorder modifier in your views just like any other modifier:

1struct ContentView: View {
2 var body: some View {
3 Text("Hello, World!")
4 .modifier(ColoredBorder(color: .red, width: 2))
5 }
6}