SwiftUI - Text 文本组件
📖 概述
Text 是 SwiftUI 中最基础的视图组件,用于显示只读文本。它功能强大,支持富文本、多行文本、文本截断等特性。
🎯 基础用法
简单文本
swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, SwiftUI!")
}
}多行文本
swift
Text("这是第一行\n这是第二行\n这是第三行")长文本自动换行
swift
Text("这是一段很长很长的文本,当它超过视图宽度时会自动换行显示。SwiftUI 会智能处理文本的布局。")
.frame(width: 200) // 限制宽度🎨 文本样式
字体设置
swift
// 系统预设字体大小
Text("Large Title").font(.largeTitle)
Text("Title").font(.title)
Text("Title 2").font(.title2)
Text("Title 3").font(.title3)
Text("Headline").font(.headline)
Text("Body").font(.body)
Text("Callout").font(.callout)
Text("Subheadline").font(.subheadline)
Text("Footnote").font(.footnote)
Text("Caption").font(.caption)
Text("Caption 2").font(.caption2)
// 自定义字体大小
Text("自定义大小").font(.system(size: 24))
// 自定义字体
Text("自定义字体").font(.custom("Helvetica", size: 20))
// 字重
Text("粗体").fontWeight(.bold)
Text("中等").fontWeight(.medium)
Text("细体").fontWeight(.light)颜色
swift
// 预设颜色
Text("红色文本").foregroundColor(.red)
Text("蓝色文本").foregroundColor(.blue)
// 自定义颜色
Text("自定义颜色").foregroundColor(Color(red: 0.5, green: 0.5, blue: 0.8))
// 十六进制颜色(需要扩展)
Text("十六进制颜色").foregroundColor(Color(hex: "FF6B6B"))
// 渐变色
Text("渐变文本")
.foregroundStyle(
LinearGradient(
colors: [.red, .blue],
startPoint: .leading,
endPoint: .trailing
)
)文本修饰
swift
// 粗体
Text("粗体文本").bold()
// 斜体
Text("斜体文本").italic()
// 删除线
Text("删除线").strikethrough()
Text("红色删除线").strikethrough(true, color: .red)
// 下划线
Text("下划线").underline()
Text("蓝色下划线").underline(true, color: .blue)
// 组合使用
Text("粗体斜体下划线")
.bold()
.italic()
.underline()📐 文本布局
对齐方式
swift
VStack {
Text("左对齐的多行文本\n第二行\n第三行")
.multilineTextAlignment(.leading)
Text("居中对齐的多行文本\n第二行\n第三行")
.multilineTextAlignment(.center)
Text("右对齐的多行文本\n第二行\n第三行")
.multilineTextAlignment(.trailing)
}
.frame(width: 200)行数限制
swift
// 限制为单行
Text("这是一段很长的文本,会被截断")
.lineLimit(1)
// 限制为2行
Text("这是一段很长的文本\n可以显示两行\n但第三行会被截断")
.lineLimit(2)
// 不限制行数(默认)
Text("文本内容")
.lineLimit(nil)截断模式
swift
Text("这是一段很长的文本,需要截断显示")
.lineLimit(1)
.truncationMode(.tail) // 尾部截断...(默认)
Text("这是一段很长的文本,需要截断显示")
.lineLimit(1)
.truncationMode(.head) // 头部截断
Text("这是一段很长的文本,需要截断显示")
.lineLimit(1)
.truncationMode(.middle) // 中间截断行间距
swift
Text("第一行\n第二行\n第三行")
.lineSpacing(10) // 设置行间距🎭 富文本
文本拼接
swift
Text("普通文本 ") +
Text("粗体文本").bold() +
Text(" 红色文本").foregroundColor(.red)Markdown 支持 (iOS 15+)
swift
// 自动解析 Markdown
Text("**粗体** *斜体* `代码`")
Text("支持 [链接](https://apple.com)")
Text("""
# 标题
这是**粗体**文本
- 列表项 1
- 列表项 2
""")AttributedString (iOS 15+)
swift
var attributedString: AttributedString {
var result = AttributedString("可交互的文本")
result.font = .title
result.foregroundColor = .blue
result.link = URL(string: "https://apple.com")
return result
}
var body: some View {
Text(attributedString)
}🔤 文本选择与复制
可选择文本 (iOS 15+)
swift
Text("这段文本可以被选择和复制")
.textSelection(.enabled)🌍 本地化
基础本地化
swift
// 自动使用本地化字符串
Text("hello_key")
// 手动指定
Text(LocalizedStringKey("hello_key"))
// 带参数的本地化
Text("Hello, \\(userName)!")字符串插值
swift
let name = "张三"
let age = 25
Text("我的名字是\\(name),今年\\(age)岁")📊 格式化
数字格式化
swift
let number = 1234.5678
Text(number, format: .number) // 1,234.568
Text(number, format: .number.precision(.fractionLength(2))) // 1,234.57
Text(number, format: .currency(code: "CNY")) // ¥1,234.57
Text(number, format: .percent) // 123,456.78%日期格式化
swift
let date = Date()
Text(date, style: .date) // 2024/01/15
Text(date, style: .time) // 14:30
Text(date, style: .relative) // 2 hours ago
Text(date, style: .offset) // +2 hours
Text(date, style: .timer) // 计时器格式🎯 实用示例
标题与副标题组合
swift
VStack(alignment: .leading, spacing: 4) {
Text("文章标题")
.font(.headline)
.foregroundColor(.primary)
Text("2024年1月15日 · 5分钟阅读")
.font(.caption)
.foregroundColor(.secondary)
}价格显示
swift
HStack(alignment: .firstTextBaseline, spacing: 2) {
Text("¥")
.font(.caption)
.foregroundColor(.red)
Text("99")
.font(.largeTitle)
.fontWeight(.bold)
.foregroundColor(.red)
Text(".99")
.font(.title3)
.foregroundColor(.red)
}徽章文本
swift
Text("NEW")
.font(.caption)
.fontWeight(.bold)
.foregroundColor(.white)
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(Color.red)
.cornerRadius(4)💡 最佳实践
- 使用系统字体 - 优先使用
.font()的预设样式,支持动态字体大小 - 注意可访问性 - 使用语义化的字体样式,支持系统字体大小设置
- 避免硬编码文本 - 使用本地化字符串
- 合理使用颜色 - 使用
.primary、.secondary等语义化颜色 - 性能考虑 - 大量文本使用
LazyVStack等懒加载容器
⚠️ 常见问题
Q: 文本不换行怎么办?
A: 确保没有设置 .lineLimit(1),或者设置为 nil
swift
Text("长文本...")
.lineLimit(nil) // 允许多行
.fixedSize(horizontal: false, vertical: true) // 垂直方向自适应Q: 如何让文本填满整行?
A: 使用 frame 配合对齐方式
swift
Text("左对齐")
.frame(maxWidth: .infinity, alignment: .leading)Q: 如何实现文本渐变色?
A: 使用 .foregroundStyle() 配合渐变
swift
Text("渐变文本")
.font(.largeTitle)
.fontWeight(.bold)
.foregroundStyle(
LinearGradient(
colors: [.purple, .pink],
startPoint: .leading,
endPoint: .trailing
)
)📚 相关组件
🔗 参考资料
掌握 Text 组件,是 SwiftUI 开发的第一步! 📝