SwiftUI 字体系统详解

在 iOS 应用开发中,文本排版是用户界面设计的关键元素之一。SwiftUI 提供了一套丰富而灵活的字体系统,让开发者能够轻松创建既美观又符合系统设计规范的文本样式。本文将深入探讨 SwiftUI 的字体系统,以及如何有效地使用它们来提升应用的用户体验。

SwiftUI 字体系统概述

SwiftUI 的字体系统主要分为三类:系统文本样式、自定义系统字体和自定义字体。这种分层设计使开发者既可以快速应用预设样式,又能在需要时进行精细的自定义。

系统文本样式(Text Style)

系统文本样式是 SwiftUI 提供的预定义字体样式,它们会根据用户在系统设置中的偏好自动调整大小,支持动态文字大小功能(Dynamic Type)。

swift 复制代码
Text("大标题").font(.largeTitle)
Text("标题").font(.title)
Text("正文内容").font(.body)
Text("图片说明").font(.caption)

以下是主要的系统文本样式及其用途:

样式 用途
.largeTitle 最大的标题样式,通常用于页面的主标题
.title 标准标题,用于重要区域的标题
.title2 二级标题,比 title 稍小
.title3 三级标题,比 title2 稍小
.headline 段落标题,通常使用粗体
.subheadline 副标题,比 headline 小
.body 正文样式,是默认的字体大小
.callout 标注文本,稍小于正文
.caption 说明文字,小字体,常用于图片说明或次要信息
.caption2 更小的说明文字
.footnote 脚注样式,比正文小
.preformatted 等宽字体,适用于代码显示(iOS 17+)

自定义系统字体

当预设样式无法满足需求时,可以使用 .system() 方法创建自定义系统字体:

swift 复制代码
// 基本自定义
Text("自定义大小").font(.system(size: 16))

// 自定义大小、粗细和设计风格
Text("圆角粗体").font(.system(size: 16, weight: .bold, design: .rounded))

字体权重选项

  • .ultraLight - 超细
  • .thin - 细体
  • .light - 轻体
  • .regular - 常规
  • .medium - 中等
  • .semibold - 半粗体
  • .bold - 粗体
  • .heavy - 重体
  • .black - 黑体

设计风格选项

  • .default - 默认系统字体
  • .serif - 衬线字体
  • .rounded - 圆角字体
  • .monospaced - 等宽字体
  • .italic - 斜体(iOS 16+)

自定义字体

对于品牌专属字体或特殊设计需求,SwiftUI 支持使用自定义字体:

swift 复制代码
// 基本自定义字体
Text("品牌专属字体").font(.custom("Brand Font", size: 14))

// 支持动态文字大小的自定义字体
Text("可调整大小的自定义字体").font(.custom("Brand Font", size: 14, relativeTo: .body))

使用 relativeTo 参数可以确保自定义字体也能响应系统的动态文字大小设置。

字体修饰符

除了设置整体字体样式,SwiftUI 还提供了单独修改字体特定属性的修饰符:

swift 复制代码
Text("粗体文本").fontWeight(.bold)
Text("斜体文本").italic()
Text("小型大写字母").textCase(.uppercase)
Text("下划线文本").underline()
Text("删除线文本").strikethrough()

最佳实践

  1. 优先使用系统文本样式:自动适应用户偏好设置,提升无障碍性
  2. 保持层次结构:使用不同字体样式建立清晰视觉层次
  3. 慎用自定义字体:确保支持动态文字大小
  4. 考虑本地化:不同语言可能需要不同的文本空间
  5. 测试极端情况:在最大和最小文字大小设置下测试界面
相关推荐
weixin_531670892 天前
Interlude起来:动作动画和文字通知哪个更适合休息提醒?Mac上有没有用桌宠做动作引导的软件?
人工智能·macos·mac·swift
Daniel_Coder2 天前
我用 SwiftUI + GRDB 做了一个「按时吃药·服药提醒」App
ios·swiftui·swift·widgetkit
末代iOS程序员华仔3 天前
iOS个人开发者账号申请为啥会被卡住
ios·swift·figma
denggun123454 天前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift
2501_915918414 天前
Swift IDE 有哪些?按平台和需求选择Swift 开发工具
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
懋学的前端攻城狮5 天前
把 SwiftUI List 换成 NSTableView:一次目录树卡顿的排查记录
macos·swiftui·swift
2501_915106325 天前
Swift 开发环境搭建指南:三条路径按目标对号入座
开发语言·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子6 天前
AI 想放弃了,人没有 -- 肘子的 Swift 周报 #150
人工智能·swiftui·swift
冯汉栩7 天前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
末代iOS程序员华仔7 天前
iOS 语聊直播/聊天APP4.3条例被拒解决
flutter·ios·swift