在Text中添加无限行(SwiftUI)

60

我正在研究如何在

struct ContentView : View {
    var body: some View {
        VStack(alignment: .leading, spacing: 10) {
            HStack {
                Text("Avocado Toast").font(.system(size: 24))
            }
            // This Text does cut, and I wonder how I can achieve multiple rows
            Text("Ingredients: Avocado, Almond Butter, Bread")
                .font(.system(size: 20))

        }
    }
}

编辑

.lineLimit(X)起到了作用。但是是否可能不设置特定的数量,例如只使用0?


请换行使用 \n 以继续下一行。 - canister_exister
尝试了一下,但它只是用三个点截断了 @canister_exister - Jacob Ahlberg
2
这可能是你正在寻找的内容:https://dev59.com/BjUCtIcB2Jgan1znLbto#56478602,https://dev59.com/v1MI5IYBdhLWcg3wVp-m#56470402。 - Martin R
1
可能是使用SwiftUI,有没有办法将文本限制为2/3行?的重复问题。 - canister_exister
@MartinR工作得很好!我们试了一下,使用0行调整无限行,但现在似乎需要设置特定数量的行。 - Jacob Ahlberg
你可以尝试使用Text("Something").truncationMode。 - nikksindia
9个回答

169

对于表单中的文本,.lineLimit(Int.max) 对我无效。似乎需要一定的宽度才能知道何时进行换行。我认为官方的方法是使用.fixedSize

Text(message)
    .fixedSize(horizontal: false, vertical: true)

文档说明:

此示例显示了在文本视图比其父视图更宽时,fixedSize(horizontal:vertical:)对文本视图的理想未截断宽度的影响。

https://developer.apple.com/documentation/swiftui/view/fixedsize(horizontal:vertical:)


2
我也遇到了同样的问题。如果你想让文本在垂直方向上扩展,可以设置 horizontal: true, vertical: false;如果想在水平方向上扩展,可以设置 horizontal: false, vertical: true - vicegax
7
这应该就是答案了,.lineLimit目前无法正常工作。 - Zhou Haibo
1
这难道不意味着标签的子大小不正确吗?就像某个 Text() 的框架没有被正确设置一样? - Zorayr
真的成功了,你这个聪明的天才! - PostCodeism
快到2023年了,这个方法仍然对我有效。谢谢! - Adammgerber
显示剩余3条评论

33

使用.lineLimit()方法限制文本的行数。该方法可以接受一个可选的整数参数(Int?),.lineLimit(nil)表示不限制行数。

编辑: 从SwiftUI Beta 5开始,Text默认行数已设为nil,因此Text中的文本将默认换行。


1
如果 lineLimit(nil) 无法正常工作,请指定一个数字,例如 lineLimit(100) - onmyway133
2
lineLimit不起作用,按照Michael建议使用fixedSize - vrwim

7

我必须添加两个不同的修饰符才能使其工作:

Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pharetra neque ex, at consectetur leo semper eu. Ut finibus maximus ex et maximus. Proin vel sagittis sapien, sed tincidunt orci.")
    .frame(maxWidth: .infinity, alignment: .leading)
    .fixedSize(horizontal: false, vertical: true)

如果您不添加frame,则文本将超出屏幕范围,而fixedSize允许其显示多行。

4
Text("Professional Burnout and how to overcome it")
     .font(.callout)
     .fixedSize(horizontal: false, vertical: true)
     .frame(width: 220)

text wrap to next line


尝试将标签放在文本字段下方,对我来说有效。 - PowerPlay

3

2
是的,否则视图会优先考虑将文本适应视图。 - Ever Uribe
给你一个金星!⭐️ - dbDev

2

之前的答案都没对我起作用,但是.lineLimit(Int.max)解决了问题。


2
lineLimitfixedSize一起使用。
设置.fixedSize(horizontal: false, vertical: true)一起,可以让文本框自动增长。
设置lineLimit决定文本框最多增长多少行。
  • 空值表示没有限制
    • lineLimit(nil).fixedSize结合使用似乎不必要,因为单独使用.fixedSize已经可以让标签尽可能地增长。
示例:
Text("Using `___VARIABLE_\(identifier): identifier___` in your template will replace that macro with `\(defaultValue)`")
    .fixedSize(horizontal: false, vertical: true)
    .lineLimit(2)

行数限制(2)

行数限制(1)

行数限制(1)


1
如果 lineLimit(nil) 对你无效,可以尝试手动设置适合你的 layoutPriority 值,例如:.layoutPriority(0.5)。这与编程有关。

0
这对我来说很有效。使用lineLimitmultilineTextAlignment
Text("")
    .multilineTextAlignment(.leading)
    .lineLimit(2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接