如何控制SwiftUI中Text视图的文本换行与布局效果
SwiftUI Text 换行规则调整方案
你观察到的文本提前换行是 SwiftUI 默认换行策略的正常表现:系统默认优先保证单词完整性,不会将单个单词拆分到两行显示,当行尾剩余宽度不足以放下完整单词时,就会将整个单词移到下一行,因此会出现行尾留白的情况:


以下是两种可实现尽可能占满行宽再换行的方案:
方案1:iOS 15+ 原生修饰符实现
如果你不需要兼容iOS 15以下的系统版本,可以直接使用SwiftUI提供的相关修饰符调整换行规则:
保留单词完整性的最优方案
开启字符收紧功能,允许系统适当缩小字符间距来尽可能在当前行放下更多内容,同时不会拆分单词:
Text("Hello, world. foo bar foobar foo hello world") .frame(maxWidth: .infinity, alignment: .leading) .padding() .background(Color.red) .allowsTightening(true) .lineBreakStrategy(.standard)
完全占满行宽方案
如果不介意单词被拆分到两行,可以直接设置换行模式为按字符换行,完全消除行尾留白:
Text("Hello, world. foo bar foobar foo hello world") .frame(maxWidth: .infinity, alignment: .leading) .padding() .background(Color.red) .lineBreakMode(.byCharWrapping)
方案2:iOS 13+ 全版本兼容方案
如果需要兼容更低版本的系统,可以通过富文本设置段落属性来自定义换行规则:
// 定义富文本属性 let contentText: AttributedString = { var attrStr = AttributedString("Hello, world. foo bar foobar foo hello world") let paragraphStyle = NSMutableParagraphStyle() // 允许字符收紧 paragraphStyle.allowsDefaultTighteningForTruncation = true // 开启连字符自动断词,尽可能在不拆分单词的前提下填充行宽 paragraphStyle.hyphenationFactor = 1.0 // 如需完全占满行宽可替换为 .byCharWrapping paragraphStyle.lineBreakMode = .byWordWrapping attrStr.paragraphStyle = paragraphStyle return attrStr }() // 使用自定义富文本的Text视图 Text(contentText) .frame(maxWidth: .infinity, alignment: .leading) .padding() .background(Color.red)
内容的提问来源于stack exchange,提问作者James Allardice
相关产品推荐
相关产品推荐

