我想设置我的文本视图的样式,使其显示的字符串对于 2 个单词中的每个单词具有不同的颜色。我知道我只能使用 2 x 不同风格的文本。但是我应该将这个字符串词保存在单独的状态变量中。但是我考虑是否可以为字符串的不同部分定义不同的 .font().foregroundColor() 。
在某些情况下,前导更长,我们只希望第一个句子或第一个单词加粗,其余文本使用常规字体。
知道如何在 SwiftUI 中实现这一点吗?
Kud*_*dos 23
如果你想要类似的东西:
不要使用 HStack,而是使用加法运算符,如下所示:
Group {
Text("I am an ")
.foregroundColor(Color.red) +
Text("iOS ")
.foregroundColor(Color.black)
.fontWeight(.heavy) +
Text("Developer:")
.foregroundColor(Color.blue)
.fontWeight(.bold)
}
Run Code Online (Sandbox Code Playgroud)
Lin*_*ous 20
您可以使用ForEach
包含在 中的循环来替代 String 的格式HStack
,尽管这有其自身的问题。以下代码将让您根据单词在字符串中的位置有条件地应用格式:
struct FancyTextView: View {
let label: String
var splicedLabel: [String] {
return label.split(separator: " ").map(String.init)
}
var body: some View {
HStack {
ForEach(0..<splicedLabel.count, id: \.self) { index in
Text(self.splicedLabel[index])
.fontWeight(index.isMultiple(of: 2) ? .bold : .regular)
.foregroundColor(index.isMultiple(of: 2) ? .blue : .red)
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
不幸的是,这个简单的解决方案不适用于更长的字符串:
我认为递归可能很有用,但我想不出一种使用 SwiftUIText() + Text()
语法使用递归的方法。
不过,你可以修改上面的代码,只用更大的字体格式化第一个单词,然后你可以使用Text() + Text()
语法:
这也消除了令人不快的HStack
和ForEach
与文本组合的格式。只需将正文更改为以下内容:
Text(splicedLabel[0] + " ")
.font(.title)
.fontWeight(.bold)
+ Text(splicedLabel[1])
Run Code Online (Sandbox Code Playgroud)
如果您使用此示例,请确保将maxSplits
参数更改.split()
为1
并检查以确保结果数组中至少有两个字符串。
希望这可以帮助!