如图,
这是一个评论列表,发评论者的名字用黑色粗体,被别人回复的名字用蓝色字体@XX显示。但当名字出现emoji的时候,就会出现颜色字体对不上的情况。
![](https://img.haomeiwen.com/i291307/187fc8f30bcb031e.jpeg)
![](https://img.haomeiwen.com/i291307/001b52cf2dc0a8be.jpeg)
代码
let SenderNickname : String = sender["nickname"] as!String//发评论人的昵称
let receiverNickname : String = receiver!["nickname"] as!String//被回复人的昵称
let contentStr = SenderNickname+"@"+receiverNickname+":"+content//内容
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))//设置黑粗体
attributeStr.addAttributes(attributes2, range: NSRange.init(location: SenderNickname.characters.count, length: receiverNickname.characters.count+1))
上述代码就是设置富文本的代码,检查一下没有问题,但为什么有emoji的话就错位了呢?之前在OC工程上面做过类似的事情,并没有出现上述问题。
我们将目标锁定在设置富文本的Rang和length这两个参数上面,将有问题的SenderNickname,和长度打印出来看看,首先用characters.count打印SenderNickname的长度
![](https://img.haomeiwen.com/i291307/915c110e51849b3b.png)
然而,OC工程做类似事情,没问题,所以我用NS对象试一下打印长度
![](https://img.haomeiwen.com/i291307/fb7c66d4b9b1c7d1.png)
因为Swift的String没有length方法,所以获取字符串长度是用characters.count,然而OC的NSString用的则是.length获取长度,在有emoji的情况下,区别就出来了。
---------分析:
我们来看一下文档关于Swift的String和OC的NSString的资料
![](https://img.haomeiwen.com/i291307/36102ecc32c6d422.png)
![](https://img.haomeiwen.com/i291307/199b0075832f2bd4.png)
我的理解是:NSString是由UTF-16单元构成,.length方法返回的是基于UTF-16的长度。Swift的characters.count返回的只是Unicode字符个数,而Swift有专门的utf16.count是对应NSString的.length方法。而addAttribute里面的Rang对应的应该就是UTF-16的长度。
问题解决了,若有不正确的地方,欢迎指出
网友评论