SwiftUI:在同一个文本视图中使用不同的颜色

Posted

技术标签:

【中文标题】SwiftUI:在同一个文本视图中使用不同的颜色【英文标题】:SwiftUI: Use of different colours within same Text view 【发布时间】:2020-08-29 20:38:05 【问题描述】:

我在一段文本中使用 .replacingOccurrences 在问题句中显示用户的答案:

           Text((question.text)
                .replacingOccurrences(of: "_____", with:
                    question.answers[question.userAnswer]
                ))
                .font(Font.custom("ClearSans-Bold", size: 18))
                .foregroundColor(.black )
                .padding(.bottom, 20)
                .multilineTextAlignment(.center)

我希望用户的回答 question.answers[question.userAnswer] 与正文的主体颜色(红色/绿色)不同(类似于附加图像)但是我是 SwiftUI 的新手,所以不知道如何添加它.

Image 1

【问题讨论】:

这能回答你的问题吗? How to use Attributed String in SwiftUI 您可以使用不同的修饰符加入Text。例如,您可以使用Text("Hello").foregroundColor(.red) + Text("World").foregroundColor(.blue) 【参考方案1】:

这是String 的扩展,它几乎可以满足您的需求:

extension String 
    func replacingOccurrences(of: String, with: [Text]) -> Text 
        return self.components(separatedBy: of).enumerated().map((i, s) in
            return i < with.count ? Text(s) + with[i] : Text(s)
        ).reduce(Text(""),  (r, t) in
            return r + t
        )
    

它使用 George_E 建议的 Text 元素的串联。你可以这样使用它:

struct ContentView: View 

    let question: String = "The witch found the concoction extremely _____. _____ makes better ones."

    let answers: [String] = ["nauseate", "A friend of her's"]

    var body: some View 
        question.replacingOccurrences(of: "_____", with: self.answers.map(s in Text(s).foregroundColor(.red))).foregroundColor(.secondary)
    

结果:

您可能需要添加一些额外的代码来处理答案数量与出现的_____ 不匹配的情况。

【讨论】:

以上是关于SwiftUI:在同一个文本视图中使用不同的颜色的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:超过 4 个组合的文本视图不能与视图修饰符一起使用

为啥在 SwiftUI 中显示视图时 List 的背景颜色不同?

SwiftUI:使用 WkWebView 突出显示具有不同颜色的文本

SwiftUI 多行文本背景颜色

升级到 Xcode 12 后,SwiftUI 列表视图有不同的颜色深浅

在 SwiftUI 中返回一个或两个不同文本视图的速记参数名称 $0 上添加条件