swift 富文本NSMutableAttributedString

背景:做app經(jīng)常遇到一段話,不同的內(nèi)容需要不一樣的字體或顏色來(lái)顯示。這種情況用NSMutableAttributedString,需要的代碼量有點(diǎn)多。需求往往是一個(gè)部分一個(gè)屬性,所以用多個(gè)部分拼湊來(lái)構(gòu)成NSAttributedString 這樣更符合業(yè)務(wù)邏輯。(靈感來(lái)自flutter)

包括兩種樣式:1.aaBB 的分塊樣式,2.aaBBaa 的插入式的樣式

(情況一: aaBB樣式有明確的分塊)

1.代碼

extension NSMutableAttributedString {

? ? convenienceinit?(elements: [(str :String, attr : [NSAttributedString.Key:Any])]) {

? ? ? ? guardelements.count>0else{

? ? ? ? ? ? returnnil

? ? ? ? }

? ? ? ? letallString:String= elements.reduce("") { (res, ele) ->Stringin

? ? ? ? ? returnres+ele.str

? ? ? ? }

? ? ? ? self.init(string: allString)

? ? ? ? foreleinelements {

? ? ? ? ? ? leteleStr = ele.str

? ? ? ? ? ? letrange:Range= allString.range(of: eleStr)!

? ? ? ? ? ? letnsRange:NSRange=NSRange(range, in: allString)

? ? ? ? ? ? self.addAttributes(ele.attr, range: nsRange)

? ? ? ? }

? ? }

}

2.使用

let lab = UILabel(frame: CGRect(x: 100, y: 200, width: 300, height: 100))

? ? ? ? view.addSubview(lab)

? ? ? ? let headStr = "head"

? ? ? ? let centerStr = "center"

? ? ? ? let backStr = "back"

? ? ? ? let attrStr = NSMutableAttributedString(elements: [

? ? ? ? ? ? (str: headStr, attr: [NSAttributedString.Key.foregroundColor : UIColor.black, NSAttributedString.Key.font

? ? ? ? ? ? ? ? : UIFont.systemFont(ofSize: 14)]),

? ? ? ? ? ? (str: centerStr, attr: [NSAttributedString.Key.foregroundColor : UIColor.yellow, NSAttributedString.Key.font

? ? ? ? ? ? ? ? : UIFont.systemFont(ofSize: 30)]),

? ? ? ? ? ? (str: backStr, attr: [NSAttributedString.Key.foregroundColor : UIColor.green, NSAttributedString.Key.font

? ? ? ? ? ? ? ? : UIFont.systemFont(ofSize: 50)])

? ? ? ? ])

? ? ? ? lab.attributedText = attrStr

3.效果圖


case1

(情況二: aaBBaa 中間插入的樣式),Global.SMEmptyIndicator = "--",?Global.SMReplaceIndicator = "****"

Extension String {

/// replace ****?use case:?報(bào)名10天結(jié)束

?/// - Parameter newStr: newStr

?func replaceXXXX(newStr: String?) -> String {

?guard newStr != nil else {

? ? ? ? ? ? ? ? ? ? ?return self.replacingOccurrences(of: Global.SMReplaceIndicator, with: Global.SMEmptyIndicator)

? ? ? ? ? ?}

? ? ? ? return self.replacingOccurrences(of: Global.SMReplaceIndicator, with: newStr!)

? ? ? ?}

}

extension?UILabel {

?/// set UILabel attributes

?/// -?Parameters:

?///?- str: text

?///?- color: textColor

?///?- fontSize: font.size

?func?setOriginalAttr(str: String, color: UIColor, fontSize: CGFloat) {

?setOriginalAttr(str: str, color: color, font: UIFont.systemFont(ofSize: fontSize))

?}

?func?setOriginalAttr(str: String, color: UIColor, font: UIFont) {

?self.text = str

?self.textColor = color

?self.font = font

?}

?/// set one part replace?"***" of UILabel's text. You must transfer this func after you transferred setOriginalAttr

?/// -?Parameters:

?///?- partStr: this part's text

?///?- partColor:?this part's text color

?///?- partFontSize:?this part's font.size

?func?setPartAttr(partStr: String?, partColor: UIColor, partFontSize: CGFloat) {

?setPartAttr(partStr: partStr, partColor: partColor, partFont: UIFont.systemFont(ofSize: partFontSize))

?}


?func?setPartAttr(partStr: String?, partColor: UIColor, partFont: UIFont) {

?guard?self.text !=?nil?&&?self.text!.notEmpty?else?{

?return

?}

?var?rightPartStr: String = partStr ?? Global.SMEmptyIndicator

?if?partStr ==?nil?|| partStr!.isEmpty {

?rightPartStr = Global.SMEmptyIndicator

?}

?let?tempStr =?self.text!.replaceXXXX(newStr: rightPartStr)

?let?attrS = NSMutableAttributedString(string: tempStr)

?guard?let?tempRange = tempStr.range(of: rightPartStr)?else?{

?return

?}

?attrS.addAttributes([NSAttributedString.Key.foregroundColor :?self.textColor ?? UIColor.black, NSAttributedString.Key.font :?self.font ?? UIFont.systemFont(ofSize: 16)], range: NSRange(location: 0, length: tempStr.count))

?attrS.addAttributes([NSAttributedString.Key.foregroundColor : partColor, NSAttributedString.Key.font : partFont], range: tempStr.nsRange(from: tempRange))

?self.attributedText = attrS

?}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 創(chuàng)新是人類智慧最高表現(xiàn)形式,是推動(dòng)人類社會(huì)前進(jìn)的車輪。 我們每個(gè)人都有不同的經(jīng)歷,每當(dāng)你有理想和目標(biāo)時(shí),自身都...
    徐書成xsc閱讀 284評(píng)論 0 0
  • 三年前的一個(gè)晚上,涼風(fēng)習(xí)習(xí)。后街一個(gè)小花園泥土地里躺著一個(gè)人。 他看起來(lái)大概在20歲左右體型微胖,長(zhǎng)的一般,口吐白...
    沉述閱讀 138評(píng)論 0 1
  • 這個(gè)領(lǐng)導(dǎo)還是令我佩服的,會(huì)做人,情商高,還會(huì)做事。 有自己的原則,不做無(wú)謂的惡人,有自己的原則。敢于與別人對(duì)抗,擺...
    沙叮熊閱讀 336評(píng)論 0 0
  • 我家住在一個(gè)山清水秀的村子里,藍(lán)天白云,鳥(niǎo)語(yǔ)花香,村里大部分人都外出打工,養(yǎng)家糊口。所以待在村里的大都是老人,我總...
    是浮朽吖閱讀 329評(píng)論 7 4

友情鏈接更多精彩內(nèi)容