使用NSMutableAttributedString为字符串中的单词添加颜色

时间:2017-01-19 18:58:08

标签: ios swift xcode uicolor nsmutableattributedstring

我正在尝试将颜色添加到字符串中的2个单词。这是我正在使用的代码:

        var HighScore:Int = 0
        var CurrentScore:Int = 0

        let stringOne = "You have managed to score \(CurrentScore). Current record is \(self.HighScore). Play again and give it another try!"
        let stringTwo = "\(CurrentScore)"
        let stringThree = "\(HighScore)"

        let range1 = (stringOne as NSString).range(of: stringTwo)
        let range2 = (stringOne as NSString).range(of: stringThree)

        let attributedText = NSMutableAttributedString.init(string: stringOne)

        attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(netHex: 0x00b4ff) , range: range1)
        attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(netHex: 0x00b4ff) , range: range2)

        gameOverDescriptionLabel.attributedText = attributedText

我遇到的问题是,如果CurrentScoreHighScore相同(例如:2& 2),range2上的颜色仍为白色,但如果不是等于(2& 1或1& 2)都得到我选择的颜色。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

如果当前得分和高分是相同的字符串,则搜索后者会找到前者(因为搜索从头开始)。

还有很多其他更好的方法可以做到这一点。

  • 在第一次搜索结果之后开始的范围内执行第二次搜索(range(of:)range: parameter,但您没有使用它)< / p>

  • 不是寻找高分的范围,而是搜索周围的样板(“你已经设法得分”等等)并找出数字必须在哪里。

  • 使用NSScanner或正则表达式查找字符串中嵌入的数字表达式。

  • 我的最爱:使用“隐身”属性标记每个数字并搜索该属性,以便您可以可靠地找到这些数字(例如here)。

答案 1 :(得分:1)

将其添加到.swift文件的顶部或底部:

extension NSMutableAttributedString {
    func bold(_ text:String) -> NSMutableAttributedString {
        let attrs:[String:AnyObject] = [NSForegroundColorAttributeName: UIColor.init(netHex: 0x00b4ff)]
        let boldString = NSMutableAttributedString(string:"\(text)", attributes:attrs)
        self.append(boldString)
        return self
    }

    func normal(_ text:String)->NSMutableAttributedString {
        let normal =  NSAttributedString(string: text)
        self.append(normal)
        return self
    }
}

下面的代码是用法,您可以按照自己喜欢的方式进行编辑,但我已经做到了这一点,您可以轻松地将其复制并粘贴到您的项目中:

            let formattedString = NSMutableAttributedString()
            formattedString
                .normal("You have managed to score ")
                .bold("\(CurrentScore)")
                .normal(". Current record is ")
                .bold("\(HighScore)")
                .normal(". Play again and give it another try!")

            gameOverDescriptionLabel.attributedText = formattedString

答案 2 :(得分:0)

不搜索范围的解决方案是为当前得分和高分创建2个单独的NSMutableAttributedString,然后将所有内容附加在一起。

let currentScoreString = NSMutableAttributedString(...)
let highscoreString = NSMutableAttributedString(...)

let finalString = NSMutableAttributedString(string: "You have managed to score ").append(currentScoreString)....

答案 3 :(得分:0)

//MARK: forgroundColor

open var foregroundColor: UIColor? {
    didSet {
        textAttributes[NSForegroundColorAttributeName] = foregroundColor
        self.attributedText = NSAttributedString(string: self.text, attributes: textAttributes)
    }
}

//MARK: backgroundColor
open var textBackgroundColor: UIColor? {
    didSet {
        textAttributes[NSBackgroundColorAttributeName] = textBackgroundColor
        self.attributedText = NSAttributedString(string: self.text, attributes: textAttributes)
    }
}