SwiftUI:如何在字符串子范围上设置具有不同字体和颜色的文本视图样式

时间:2019-11-27 13:30:56

标签: swift swiftui

我想设置“文本”视图的样式,以使其显示的字符串在2个单词中每个都有不同的颜色。我知道我可以只使用2个具有不同样式的文本。但是,然后我应该将此字符串字保留在单独的状态变量中。但是我考虑是否可以为字符串的不同部分定义不同的.font()。foregroundColor()。

在某些情况下,引线的长度会更长,我们只希望将第一个句子或第一个单词加粗,而其余文本则使用常规字体。

有任何想法如何在SwiftUI中实现吗?

1 个答案:

答案 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)
        }
    }

}

}

String formatting example

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

Poor formatting for longer strings

我认为递归可能很有用,但我想不出一种将递归与SwiftUI的Text() + Text()语法结合使用的方法。

仍然,您可以修改上面的代码以仅使用更大的字体格式化第一个单词,然后可以使用Text() + Text()语法:

First word formatting

这也消除了HStackForEach与文本组合的不愉快格式。只需将主体更改为以下内容即可:

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

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

希望这会有所帮助!