gpt4 book ai didi

SwiftUI:如何在字符串子范围上设置不同字体和颜色的 TextView 样式

转载 作者:行者123 更新时间:2023-12-03 09:19:10 24 4
gpt4 key购买 nike

我想设置我的 TextView 的样式,使其显示的字符串对于 2 个单词中的每个单词具有不同的颜色。我知道我只能使用 2 x 不同风格的文本。但是我应该将这个字符串词保存在单独的状态变量中。但是我考虑是否可以为字符串的不同部分定义不同的 .font().foregroundColor() 。

在某些情况下,前导更长,我们只希望第一个句子或第一个单词加粗,其余文本使用常规字体。

知道如何在 SwiftUI 中实现这一点吗?

最佳答案

您可以使用 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)
}
}

}

}

String formatting example

不幸的是,这个简单的解决方案不适用于更长的字符串:

Poor formatting for longer strings

我认为递归可能有用,但我想不出在 SwiftUI 的 Text() + Text() 中使用递归的方法句法。

不过,你可以修改上面的代码,只用更大的字体格式化第一个单词,然后你可以使用 Text() + Text()句法:

First word formatting

这也消除了 HStack 令人不快的格式。和 ForEach与文字结合。只需将正文更改为以下内容:
Text(splicedLabel[0] + " ")
.font(.title)
.fontWeight(.bold)
+ Text(splicedLabel[1])

如果您使用此示例,请确保更改 maxSplits .split() 中的参数至 1并检查以确保结果数组中至少有两个字符串。

希望这可以帮助!

关于SwiftUI:如何在字符串子范围上设置不同字体和颜色的 TextView 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com