SwiftUI中如何避免含符号的单词被换行拆分?
SwiftUI 文本自动换行拆分问题解决
我在SwiftUI中用Text组件展示“McDonnell Douglas F/A-18 Hornet”时,文本自动在“F/”处拆分换行——第一行显示“McDonnell Douglas F/”,第二行显示“A-18”。我希望换行发生在“McDonnell Douglas”之后,让“F/A-18”完整显示在同一行。
当前效果:文本在“F/”位置被拆分,分两行显示
期望效果:仅在“McDonnell Douglas”后换行,“F/A-18”保持完整一行
我的实现代码:
import SwiftUI struct ContentView: View { var body: some View { GeometryReader { g in Text("McDonnell Douglas F/A-18") .font(.system(size: g.size.width * 1 / 20)) .frame(width: g.size.width / 2) .border(.black) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
注:我知道可以用\n手动指定换行,但不同设备屏幕尺寸不同,没法固定这个位置,所以这种方法不适用。
可行解决方案
SwiftUI的Text默认会根据符号(比如/)作为换行分割点,要避免这种情况,有几种适配不同屏幕的方法:
1. 用非断字空格替换普通空格
把“McDonnell Douglas”后的普通空格换成非断字空格(\u{00A0}),这样系统会优先在这个位置换行,同时保证“F/A-18”不会被拆分:
Text("McDonnell Douglas\u{00A0}F/A-18")
2. 禁用连字与紧排
通过.hyphenation(.never)禁用连字,.allowsTightening(false)禁止文本压缩,强制系统不在符号处拆分文本:
Text("McDonnell Douglas F/A-18") .font(.system(size: g.size.width * 1 / 20)) .frame(width: g.size.width / 2) .border(.black) .hyphenation(.never) .allowsTightening(false)
3. 拆分Text片段组合
将需要保持完整的“F/A-18”单独作为一个Text组件,和前面的文本拼接,系统不会拆分单个Text片段内的内容:
Text("McDonnell Douglas ") + Text("F/A-18")
这三种方法都能自动适配不同屏幕尺寸,在合适的位置换行,同时保证“F/A-18”的完整性。
内容的提问来源于stack exchange,提问作者Churro the Duck
相关产品推荐
相关产品推荐

