Cannot find System Bold Font for Attribute String iOS Xcode
Categories:
Resolving 'System Bold' Font Issues in iOS NSAttributedString

Learn how to correctly apply system bold fonts to NSAttributedString
in iOS, addressing common pitfalls and ensuring consistent UI across devices and iOS versions.
When working with NSAttributedString
in iOS, developers often encounter challenges when trying to apply system-defined fonts, especially system bold. Unlike direct font names, 'System Bold' isn't a literal font family name you can simply pass to UIFont
. This article delves into the correct methods for achieving system bold styling, explaining why common approaches fail and providing robust solutions.
Understanding System Fonts in iOS
iOS uses a dynamic approach to system fonts. Instead of fixed font names like 'Helvetica-Bold', it provides programmatic ways to access the system font with specific traits (like bold, italic, or monospaced) and weights (light, regular, semibold, etc.). This abstraction allows Apple to update the system font (e.g., from Helvetica Neue to San Francisco) without breaking existing applications that rely on UIFont.systemFont(ofSize:weight:)
or UIFont.boldSystemFont(ofSize:)
.
flowchart TD A[Developer wants System Bold] --> B{Direct Font Name?} B -- No --> C[Use `UIFont.systemFont(ofSize:weight:)`] C --> D[Specify `.bold` weight] D --> E[Apply to `NSAttributedString`] B -- Yes --> F[Fails: 'System Bold' is not a font name] F --> G[Result: Default font or crash] E --> H[Success: Correct System Bold]
Decision flow for applying system bold fonts to NSAttributedString
.
The Problem: 'System Bold' is Not a Font Name
A common mistake is attempting to create a UIFont
instance using a string like "System Bold"
or "SFUI-Bold"
. These strings are not valid font family or font face names that UIFont(name:size:)
can resolve. When you try to initialize a font this way, UIFont
will return nil
, leading to unexpected behavior or a default font being used, which is rarely the desired outcome for a bold style.
let invalidFont = UIFont(name: "System Bold", size: 17.0)
// invalidFont will be nil!
let attributedString = NSMutableAttributedString(string: "Hello World")
if let font = invalidFont {
attributedString.addAttribute(.font, value: font, range: NSRange(location: 0, length: 5))
} else {
print("Error: Could not find 'System Bold' font.")
// The text 'Hello' will not be bolded as intended.
}
Incorrect attempt to create a system bold font by name.
The Solution: Using UIFont.systemFont(ofSize:weight:)
The correct way to obtain a system bold font is to use the UIFont.systemFont(ofSize:weight:)
class method, specifying .bold
for the weight parameter. This method ensures that you always get the current system font with the bold trait, regardless of the underlying font family Apple uses.
let boldSystemFont = UIFont.systemFont(ofSize: 17.0, weight: .bold)
let attributedString = NSMutableAttributedString(string: "This text should be bold.")
attributedString.addAttribute(
.font,
value: boldSystemFont,
range: NSRange(location: 0, length: attributedString.length)
)
// Example for a specific range:
let partialBoldString = NSMutableAttributedString(string: "Hello World")
let boldRange = NSRange(location: 0, length: 5) // 'Hello'
partialBoldString.addAttribute(
.font,
value: UIFont.systemFont(ofSize: 17.0, weight: .bold),
range: boldRange
)
// To display in a UILabel:
let label = UILabel()
label.attributedText = partialBoldString
Correctly applying system bold font to NSAttributedString
.
UIFont.systemFont(ofSize:weight:)
is not available, you would use UIFont.boldSystemFont(ofSize:)
. However, for modern iOS development, the weight
parameter is preferred for finer control.Integrating with NSAttributedString
Attributes
Once you have the correct UIFont
instance, applying it to an NSAttributedString
is straightforward. You use the .font
attribute key and provide your UIFont
object as the value. Remember to specify the NSRange
over which the attribute should apply.
1. Create your base string
Initialize an NSMutableAttributedString
with the text you want to style.
2. Obtain the system bold font
Use UIFont.systemFont(ofSize: YOUR_SIZE, weight: .bold)
to get the desired font instance.
3. Define the range
Determine the NSRange
(location and length) within your string where the bold style should be applied.
4. Apply the attribute
Use attributedString.addAttribute(.font, value: boldSystemFont, range: yourRange)
to apply the font.
5. Assign to UI element
Set the attributedText
property of your UILabel
, UITextView
, or other compatible UI element.