SwiftUI:如何在字符串子范围上使用不同的字体和颜色进行样式文本视图

iaqfqrcu  于 2022-11-28  发布在  Swift
关注(0)|答案(2)|浏览(129)

我想设计我的文本视图,使它显示的字符串中的两个单词有不同的颜色。我知道我可以用不同的样式使用两个文本。但是我应该把这个字符串单词保存在单独的状态变量中。但是我考虑是否有可能为字符串的不同部分定义不同的.font().foregroundColor()。
也有一些情况下,当有较长的铅,我们希望只有第一句话或第一个词是粗体,其余的文字有正常的字体。
你知道如何在SwiftUI中实现这一点吗?

a5g8bdjr

a5g8bdjr1#

您可以使用HStack中的ForEach循环来替换String的格式,尽管这会带来一些问题。下面的代码允许您根据单词在字符串中的位置有条件地应用格式:

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()语法:

这也删除了带有文本的HStackForEach组合的令人不快的格式。只需将正文更改为以下内容:

Text(splicedLabel[0] + " ")
        .font(.title)
        .fontWeight(.bold)
    + Text(splicedLabel[1])

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

aydmsdu9

aydmsdu92#

如果您需要类似以下的内容:

不要使用HStack,而是使用加法运算符,如下所示:

Group {
        Text("I am an ")
            .foregroundColor(Color.red) +
        Text("iOS ")
            .foregroundColor(Color.black)
            .fontWeight(.heavy) +
        Text("Developer:")
            .foregroundColor(Color.blue)
            .fontWeight(.bold)
    }

相关问题