我想设计我的文本视图,使它显示的字符串中的两个单词有不同的颜色。我知道我可以用不同的样式使用两个文本。但是我应该把这个字符串单词保存在单独的状态变量中。但是我考虑是否有可能为字符串的不同部分定义不同的.font().foregroundColor()。也有一些情况下,当有较长的铅,我们希望只有第一句话或第一个词是粗体,其余的文字有正常的字体。你知道如何在SwiftUI中实现这一点吗?
a5g8bdjr1#
您可以使用HStack中的ForEach循环来替换String的格式,尽管这会带来一些问题。下面的代码允许您根据单词在字符串中的位置有条件地应用格式:
HStack
ForEach
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()语法:
Text() + Text()
这也删除了带有文本的HStack和ForEach组合的令人不快的格式。只需将正文更改为以下内容:
Text(splicedLabel[0] + " ") .font(.title) .fontWeight(.bold) + Text(splicedLabel[1])
如果使用此示例,请确保将.split()中的maxSplits参数更改为1,并检查以确保结果数组中至少有两个字符串。
.split()
maxSplits
1
aydmsdu92#
如果您需要类似以下的内容:
不要使用HStack,而是使用加法运算符,如下所示:
Group { Text("I am an ") .foregroundColor(Color.red) + Text("iOS ") .foregroundColor(Color.black) .fontWeight(.heavy) + Text("Developer:") .foregroundColor(Color.blue) .fontWeight(.bold) }
2条答案
按热度按时间a5g8bdjr1#
您可以使用
HStack
中的ForEach
循环来替换String的格式,尽管这会带来一些问题。下面的代码允许您根据单词在字符串中的位置有条件地应用格式:不幸的是,这个简单的解决方案不适用于较长的字符串:
我认为递归可能很有用,但我想不出一种方法来将递归与SwiftUI的
Text() + Text()
语法一起使用。不过,您可以修改上述代码,只将第一个单词的字体设置为较大,然后使用
Text() + Text()
语法:这也删除了带有文本的
HStack
和ForEach
组合的令人不快的格式。只需将正文更改为以下内容:如果使用此示例,请确保将
.split()
中的maxSplits
参数更改为1
,并检查以确保结果数组中至少有两个字符串。aydmsdu92#
如果您需要类似以下的内容:
不要使用HStack,而是使用加法运算符,如下所示: