Text 视图如何处理多行显示、截断(Truncation)和行间距?
在 SwiftUI 中,Text 视图提供了非常直观的修饰符(Modifiers)来处理多行文本、截断方式以及行间距。
以下是详细的分类讲解和代码示例:
1. 多行显示 (Multi-line Display)
默认情况下,Text 视图会根据容器的宽度自动换行。如果你需要控制显示的行数,主要使用 .lineLimit() 修饰符。
- 默认行为:自动换行,显示所有文本(只要空间足够)。
- 限制行数:
lineLimit(2):最多显示 2 行。lineLimit(1):强制单行显示。lineLimit(nil):允许无限行(默认值)。
- 范围限制 (iOS 16+):
lineLimit(2...4):最少占 2 行的高度,最多显示 4 行。
plaintext
Text("这是一段非常长的文本,用来测试多行显示的效果。它会自动换行,除非你限制了它。")
.lineLimit(2) // 限制最多显示两行
2. 截断模式 (Truncation Mode)
当文本内容超过了 lineLimit 设定的行数,或者超过了视图的可用空间时,文本会被截断。你可以通过 .truncationMode() 来控制省略号的位置。
.tail(默认):在末尾截断 (例如: "Abc...")。.head:在开头截断 (例如: "...xyz")。.middle:在中间截断 (例如: "Abc...xyz")。
plaintext
Text("这是一段非常长的文本,用来测试截断效果。")
.lineLimit(1)
.truncationMode(.middle) // 结果可能像: "这是一段...截断效果。"
3. 行间距 (Line Spacing)
你可以通过 .lineSpacing() 来调整行与行之间的额外距离。
- 注意:这个数值是额外增加的间距(Points),不是行高(Line Height)。它只影响行与行之间的缝隙,不影响第一行上方或最后一行下方。
plaintext
Text("这是第一行\n这是第二行\n这是第三行")
.lineSpacing(10) // 在每行之间增加 10pt 的间距
4. 综合示例代码
下面是一个完整的 SwiftUI 视图示例,展示了如何组合使用这些属性,以及如何设置对齐方式(因为处理多行文本时,对齐通常也很重要)。
plaintext
import SwiftUI
struct TextHandlingExample: View {
let longText = "SwiftUI 是苹果推出的声明式 UI 框架。Text 视图功能强大,支持多行显示、自定义截断模式以及调整行间距。掌握这些属性对于构建漂亮的排版至关重要。"
var body: some View {
VStack(spacing: 30) {
// 1. 默认多行显示 + 行间距
VStack(alignment: .leading) {
Text("1. 多行 & 行间距 (10pt)")
.font(.headline)
Text(longText)
.lineSpacing(10) // 设置行间距
.multilineTextAlignment(.leading) // 设置多行对齐方式
.padding()
.background(Color.gray.opacity(0.1))
}
// 2. 限制行数 + 尾部截断 (默认)
VStack(alignment: .leading) {
Text("2. 限制 2 行 (尾部截断)")
.font(.headline)
Text(longText)
.lineLimit(2)
.padding()
.background(Color.yellow.opacity(0.2))
}
// 3. 限制 1 行 + 中间截断
VStack(alignment: .leading) {
Text("3. 限制 1 行 (中间截断)")
.font(.headline)
Text(longText)
.lineLimit(1)
.truncationMode(.middle)
.padding()
.background(Color.blue.opacity(0.1))
}
}
.padding()
}
}
struct TextHandlingExample_Previews: PreviewProvider {
static var previews: some View {
TextHandlingExample()
}
}
补充技巧:自动缩放 (Minimum Scale Factor)
有时候你不想截断文本,而是希望文字自动变小以适应空间。可以使用 .minimumScaleFactor()。
plaintext
Text("这段文字如果太长,会自动缩小字体,而不是显示省略号。")
.lineLimit(1)
.minimumScaleFactor(0.5) // 允许字体最小缩放到原大小的 50%
总结
| 功能 | 修饰符 (Modifier) | 常用值 |
|---|---|---|
| 行数限制 | .lineLimit(_) |
Int (如 2), nil (无限), Range (如 2...4) |
| 截断模式 | .truncationMode(_) |
.tail (默认), .head, .middle |
| 行间距 | .lineSpacing(_) |
CGFloat (如 10.0) |
| 多行对齐 | .multilineTextAlignment(_) |
.leading, .center, .trailing |