首页 文章

更改由星号包围的UILabel部分上的文本颜色

提问于
浏览
0

我有一个如下字符串:

let myString = "This is my *awesome* label which *should* change color";

我需要做的是将此文本添加到UILabel,将文本颜色更改为橙色,其中文本的各部分由星号包围,并在显示之前删除星号 .

我怎么能做到这一点?

我知道你可以使用标签的属性文本组合不同颜色的文本,但不知道如何分解字符串以实现所需的行为 .

1 回答

  • 1

    您可以使用正则表达式:

    let regex = try! NSRegularExpression(pattern: "[\\*]{1}[^\\*]+[\\*]{1}")
    

    regex 是匹配的正则表达式:

    • 一个星号: [\\*]{1} . 其次是,

    • 一个或多个不是星号的字符: [^\\*]+ . 其次是,

    • 一个星号: [\\*]{1}

    我们来看看比赛:

    let str = "This is my *awesome* label which *should* change color"
    let length = (str as NSString).length
    let rg = NSRange(location: 0, length: length)
    let matches = regex.matches(in: str, range: rg)
    let ranges = matches.map {$0.range}
    

    让我们创建一个可变的属性字符串:

    let attributedString = NSMutableAttributedString(string: str)
    

    并将 foregroundColor 属性添加到匹配项中,并删除星号:

    let attribute = [NSAttributedString.Key.foregroundColor: UIColor.orange]
    let startIndex = str.startIndex
    ranges.reversed()
        .forEach{ range in
            attributedString.addAttributes(attribute, range: range)
            let start = str.index(startIndex, offsetBy: range.lowerBound.advanced(by: 1))
            let end = str.index(startIndex, offsetBy: range.upperBound.advanced(by: -1))
            let withoutAsterisk = String(str[start..<end])
            attributedString.replaceCharacters(in: range, with: withoutAsterisk)
    }
    

    并设置标签的 attributedText

    label.attributedText = attributedString
    

相关问题