Format Text in SwiftUI
Written by Team Kodeco
Formatting text is important when designing user interfaces, as it helps emphasize certain aspects of your text and makes it easier for your users to read. In SwiftUI, formatting text is simple, as you can easily apply various appearance styles to your text.
To format text in SwiftUI, you can use the fontWeight, italic, underline and strikethrough modifiers.
For example, say you want to create a Text view with the word “Hello” in bold and italic, and the word “World” underlined. You can achieve this with the following code:
struct ContentView: View {
var body: some View {
Text("Hello ")
.fontWeight(.bold)
.italic()
+ Text("World")
.underline()
}
}
The preview should look as follows:
In this example, you use the fontWeight modifier to make the “Hello” text bold, and the italic modifier to italicize it. Then, you use the + operator to concatenate another Text view that displays the “World” text, and apply the underline modifier to it to underline it.
You can also apply multiple formatting styles by chaining the modifiers together. For example:
struct ContentView: View {
var body: some View {
Text("Hello, World!")
.fontWeight(.semibold)
.italic()
.underline()
.strikethrough(true, color: .red)
}
}
The preview should look as follows:
Here, you use the fontWeight modifier with a value of .semibold, the italic modifier, the underline modifier and the strikethrough modifier with a value of true to cross out the text with a red line.
Styling Text with Markdown
SwiftUI’s Text view provides two ways of styling your text with Markdown: directly within the Text view and using an AttributedString. Using Markdown directly within a Text view can be convenient for static text, but you’ll need to use AttributedString for dynamic strings or when you want to apply styles to different parts of the string programmatically.
Using Markdown Directly in Text
You can include Markdown directly within a Text view to apply certain styles. Here’s an example:
struct ContentView: View {
var body: some View {
Text("**Bold** and _italic_ text!")
}
}
The preview should look like:
This renders a Text view with “Bold” in bold text and “italic” in italic text.
Using AttributedString for Advanced Styling
For more advanced or dynamic styling, AttributedString is the tool of choice. It lets you apply different styles to different parts of the string. You can mix SwiftUI modifiers with AttributedString attributes. Importantly, the attributes applied through AttributedString take precedence over SwiftUI modifiers.
Here’s an example that applies different styles to different parts of a text:
let quote = """
**"Be yourself;** everyone else is _already taken._"
- **Oscar Wilde**
"""
let attributedQuote = try! AttributedString(markdown: quote)
struct ContentView: View {
var body: some View {
Text(attributedQuote)
.font(.system(size: 16, weight: .medium, design: .serif))
.foregroundColor(.blue)
}
}
The preview should look as follows:
In this example, the AttributedString uses Markdown syntax to make “Be yourself;” and “Oscar Wilde” bold and “everyone else is already taken.” italic. When this AttributedString is passed to the Text view, these styles are preserved.
Notice that when you apply the font and foregroundColor modifiers to the Text view, these styles apply to the entire text, but they don’t override the bold and italic styles specified by the AttributedString. This is because styles applied through AttributedString take precedence over SwiftUI modifiers.