You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中ForEach内Text如何实现每个单词单独占一行显示

实现效果参考

效果截图

现存问题
  • 首个方块展示符合预期:单词长度超出frame宽度时自动多行展示的效果正常
  • 最后一个方块内的「JUDO MIX」需要和「BASKETBALL MIX」保持一致的2行展示效果,即每个单词单独占一行
  • 现有代码中Text组件写在ForEach循环内,直接修改Text的frame属性会导致BASKETBALL这类长单词被截断,需要兼容两种场景:长单词正常换行不截断、空格分隔的不同单词强制各占一行
当前实现代码
ForEach(0 ..< array.count, id: \.self) { index in
    Image(array[index].val)
        .customReflection()
    VStack {
        Text(array[index].category)
            .font(.title)
            .fontWeight(.bold)
            .multilineTextAlignment(.center)
            .frame(width: 181)
    }
}
实现方案

直接把分类字符串按空格拆成独立单词,用VStack垂直排列每个单词即可,不会影响长单词的展示逻辑:

ForEach(0 ..< array.count, id: \.self) { index in
    Image(array[index].val)
        .customReflection()
    VStack(spacing: 0) {
        // 按空格拆分出所有独立单词
        let wordList = array[index].category.components(separatedBy: " ")
        ForEach(wordList, id: \.self) { word in
            Text(word)
                .font(.title)
                .fontWeight(.bold)
                .multilineTextAlignment(.center)
                .lineLimit(1)
                .minimumScaleFactor(0.6) // 长单词自动适配宽度,不会截断,可根据UI需求调整缩放下限
        }
    }
    .frame(width: 181)
}
  • 逻辑说明:
    • 拆分单词后垂直堆叠,天然保证每个单词单独占一行,不会出现JUDO和MIX挤在同一行的问题
    • 给单个单词文本加最小缩放系数,遇到BASKETBALL这类长度较长的单词时,会自动微调字号适配181的宽度,不会出现截断。如果不想缩放字号,去掉lineLimit(1)和minimumScaleFactor即可,长单词会按原有逻辑自动按字符换行。
    • 保留原有的宽度、字体、粗细设置,和现有UI风格统一

内容的提问来源于stack exchange,提问作者Fabez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:39:18