我想设置“文本”视图的样式,以使其显示的字符串在2个单词中每个都有不同的颜色。我知道我可以只使用2个具有不同样式的文本。但是,然后我应该将此字符串字保留在单独的状态变量中。但是我考虑是否可以为字符串的不同部分定义不同的.font()。foregroundColor()。
在某些情况下,引线的长度会更长,我们只希望将第一个句子或第一个单词加粗,而其余文本则使用常规字体。
有任何想法如何在SwiftUI中实现吗?
答案 0 :(得分:0)
您可以使用ForEach
内的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)
}
}
}
}
不幸的是,这种简单的解决方案不适用于较长的字符串:
我认为递归可能很有用,但我想不出一种将递归与SwiftUI的Text() + Text()
语法结合使用的方法。
仍然,您可以修改上面的代码以仅使用更大的字体格式化第一个单词,然后可以使用Text() + Text()
语法:
这也消除了HStack
和ForEach
与文本组合的不愉快格式。只需将主体更改为以下内容即可:
Text(splicedLabel[0] + " ")
.font(.title)
.fontWeight(.bold)
+ Text(splicedLabel[1])
如果使用此示例,请确保将maxSplits
中的.split()
参数更改为1
,并检查以确保结果数组中至少有两个字符串。 / p>
希望这会有所帮助!