如圖抄囚,
這是一個(gè)評(píng)論列表泊藕,發(fā)評(píng)論者的名字用黑色粗體,被別人回復(fù)的名字用藍(lán)色字體@XX顯示炒事。但當(dāng)名字出現(xiàn)emoji的時(shí)候臀栈,就會(huì)出現(xiàn)顏色字體對(duì)不上的情況。
代碼
let SenderNickname : String = sender["nickname"] as!String//發(fā)評(píng)論人的昵稱
let receiverNickname : String = receiver!["nickname"] as!String//被回復(fù)人的昵稱
let contentStr = SenderNickname+"@"+receiverNickname+":"+content//內(nèi)容
let attributeStr : NSMutableAttributedString = NSMutableAttributedString.init(string: contentStr)
attributeStr.yy_font = UIFont.systemFont(ofSize: 15)
attributeStr.yy_lineSpacing = 5
attributeStr.yy_alignment = NSTextAlignment.left
let attributes1: [String: UIFont] = [NSFontAttributeName: UIFont.init(name: "Helvetica-Bold", size: 15)!]
let attributes2: [String: UIColor] = [NSForegroundColorAttributeName: kRGBA(77, g: 135, b: 175, a: 1)]
attributeStr.addAttributes(attributes1, range: NSRange.init(location: 0, length: SenderNickname.characters.count))//設(shè)置黑粗體
attributeStr.addAttributes(attributes2, range: NSRange.init(location: SenderNickname.characters.count, length: receiverNickname.characters.count+1))
上述代碼就是設(shè)置富文本的代碼挠乳,檢查一下沒(méi)有問(wèn)題权薯,但為什么有emoji的話就錯(cuò)位了呢姑躲?之前在OC工程上面做過(guò)類似的事情,并沒(méi)有出現(xiàn)上述問(wèn)題崭闲。
我們將目標(biāo)鎖定在設(shè)置富文本的Rang和length這兩個(gè)參數(shù)上面肋联,將有問(wèn)題的SenderNickname威蕉,和長(zhǎng)度打印出來(lái)看看刁俭,首先用characters.count打印SenderNickname的長(zhǎng)度
然而,OC工程做類似事情韧涨,沒(méi)問(wèn)題牍戚,所以我用NS對(duì)象試一下打印長(zhǎng)度
因?yàn)镾wift的String沒(méi)有l(wèi)ength方法,所以獲取字符串長(zhǎng)度是用characters.count虑粥,然而OC的NSString用的則是.length獲取長(zhǎng)度如孝,在有emoji的情況下,區(qū)別就出來(lái)了娩贷。
---------分析:
我們來(lái)看一下文檔關(guān)于Swift的String和OC的NSString的資料
我的理解是:NSString是由UTF-16單元構(gòu)成,.length方法返回的是基于UTF-16的長(zhǎng)度彬祖。Swift的characters.count返回的只是Unicode字符個(gè)數(shù)茁瘦,而Swift有專門的utf16.count是對(duì)應(yīng)NSString的.length方法。而addAttribute里面的Rang對(duì)應(yīng)的應(yīng)該就是UTF-16的長(zhǎng)度储笑。
問(wèn)題解決了,若有不正確的地方甜熔,歡迎指出