在 SwiftUI 中,lineLimit 是一个用于限制文本视图显示行数的修饰符。它会限制 Text 视图最多显示的行数,如果文本内容超过指定的行数,超出的部分将被截断(根据 truncationMode 决定截断方式)。
基本语法
Text("Your long text here")
.lineLimit(2) // 限制为最多两行
参数
nil(默认):表示不限制行数,文本会根据内容自动换行并占用所需的空间。
Int:指定允许的最大行数(如 1、2 等),超出部分会被截断。
使用场景
1、限制单行文本
Text("This is a very long line of text that will be truncated.And Something...")
.lineLimit(1) // 限制为单行
效果:
如果文本超过一行的宽度,它将被截断。
默认使用 truncationMode(.tail),截断的部分会显示省略号 …。
2、限制多行文本
Text("""
This is a very long line of text that will be truncated if it exceeds two lines of space.
""")
.lineLimit(2) // 限制为最多两行
效果:
文本最多显示两行,超出的部分会被截断并显示省略号。
3、与 .truncationMode() 配合
可以结合 truncationMode 修饰符,指定文本截断的位置:
Text("This is a very long line of text that will be truncated.And Something...")
.lineLimit(1)
.truncationMode(.head) // 在文本开头截断
可选值:
.head:截断开头的部分,显示为 …ext that will be truncated.
.middle:截断中间的部分,显示为 This is a…uncated.
.tail(默认):截断末尾的部分,显示为 This is a very long line of text that will be…
动态调整文本布局
结合其他修饰符,可以实现动态调整布局:
1、与 frame 配合
Text("This is a very long line of text that will be truncated.")
.lineLimit(1)
.frame(width: 150) // 限制宽度,触发截断
效果:
文本宽度受到限制,因此如果内容超出,会根据 lineLimit 的设置进行截断。
2、与 minimumScaleFactor 配合
如果希望文本在空间不足时缩小字体而不是截断,可以使用 minimumScaleFactor:
Text("This is a very long line of text.")
.lineLimit(1)
.frame(width: 150)
.minimumScaleFactor(0.5) // 最多缩小到原始字体大小的 50%
效果:
当文本超出指定行数时,会先尝试缩小字体;如果仍然超出,会截断。
3、与 fixedSize 配合
通过 fixedSize 修饰符,可以让文本不受父容器限制而显示完整内容:
Text("This is a very long line of text.And Something is very good")
.lineLimit(1)
.fixedSize(horizontal: true, vertical: false) // 水平方向固定大小
效果:
文本不会因为父容器的宽度而被截断,但会受 lineLimit 限制。
注意事项
1、lineLimit 的行为依赖于文本内容是否超出可用空间:
如果内容没有超出限制,则不会影响布局。
如果内容超出指定行数,则会触发截断。
2、与 frame 等布局修饰符一起使用时,可能需要调整文本宽度或高度,才能观察到实际效果。
3、如果没有设置 lineLimit,文本默认会占据需要的行数,而不会被截断。
示例:结合 VStack
struct ContentView: View {
var body: some View {
VStack {
Text("This is a short line.")
.lineLimit(1)
.background(Color.green)
Text("This is a much longer line of text that should be truncated.")
.lineLimit(1)
.background(Color.blue)
}
.frame(width: 150) // 限制父容器宽度
}
}
结果:
第一行会完整显示,因为它没有超出父容器宽度。
第二行会被截断,并显示省略号。
总结
lineLimit 是一个非常灵活的修饰符,主要用于限制 Text 视图的最大行数。
可以结合 truncationMode、frame、fixedSize 等修饰符自定义文本显示。
适合在复杂布局中优化文本显示效果,特别是处理长文本时。