NSAttributedString前景色设置仅生效一次,电话文本颜色未正常变更
搞定你的富文本样式问题
嘿,我一眼就看出问题出在哪了——你用的setAttributes(_:range:)方法其实是个「覆盖型选手」,它会完全替换指定范围内的所有现有属性,而不是给你追加新的样式。
看你代码的执行顺序:
- 你先给电话号码的范围设置了蓝色文字
- 紧接着又调用
setAttributes只传了下划线样式,这一步直接把之前设置的蓝色属性给覆盖没了!结果电话号码的颜色就变回了默认(或者继承了前面文本的红色),只剩下下划线。
两种简单的解决办法
办法一:把属性打包一次设置
把颜色和下划线样式放进同一个字典,一次性调用setAttributes,这样就不会有覆盖的问题了:
let text = "call " let phone = "1800-800-900" let attrString = NSMutableAttributedString(string: text + phone, attributes: nil) let rangeText = (attrString.string as NSString).range(of: text) let rangePhone = (attrString.string as NSString).range(of: phone) attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], range: rangeText) // 把颜色和下划线属性合并到一个字典里 attrString.setAttributes([ NSAttributedString.Key.foregroundColor: UIColor.blue, NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ], range: rangePhone)
办法二:用addAttributes追加属性
如果你的业务逻辑需要分开设置属性(比如动态添加样式),那就别用setAttributes了,改用addAttributes(_:range:)——它只会新增或更新指定的属性,不会动已经存在的属性:
let text = "call " let phone = "1800-800-900" let attrString = NSMutableAttributedString(string: text + phone, attributes: nil) let rangeText = (attrString.string as NSString).range(of: text) let rangePhone = (attrString.string as NSString).range(of: phone) attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], range: rangeText) attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.blue], range: rangePhone) // 用addAttributes追加下划线,不会覆盖已有的蓝色 attrString.addAttributes([NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue], range: rangePhone)
试一下这两种方法,电话号码就能同时显示蓝色和单下划线啦~
内容的提问来源于stack exchange,提问作者Aviran
相关产品推荐
相关产品推荐

