带有emojis的NSAttributedString结束时未格式化

Joj*_*dmo 5 nsattributedstring uilabel ios nsmutableattributedstring swift

NSAttributedString在内容中使用表情符号的结尾没有被格式化.我正在尝试格式化整个字符串(在此示例中将文本颜色设置为白色,以简化),但是当放入文本时,某些文本保持未格式化UILabel.

在此输入图像描述

目前,我正在使用

let attributedString = NSMutableAttributedString(string: contents)

attributedString.addAttribute(
    NSForegroundColorAttributeName,
    value: UIColor.white,
    range: NSMakeRange(0, contents.characters.count)
)

label.attributedText = attributedString
Run Code Online (Sandbox Code Playgroud)

我也试过通过使用contents.utf8.count获得长度,但获得相同的结果.

我注意到未格式化的字符数与字符串中的表情符号数相同.这可能与正在发生的事情有关吗?

Joj*_*dmo 17

String.characters.count返回字符串中呈现的字符数.一些表情符号(例如标志和种族特定的表情符号)是两个或多个UTF字符的组合,这些字符被渲染为一个字符,以便允许更多的表情符号.

UTF代表Unicode转换格式,或简称Unicode.它允许计算机,手机,平板电脑和其他所有电子设备使用相同的标准化字符集.

实现它的人可以选择如何呈现文本,但设备使用标准化字符集进行通信非常重要.否则,向某人发送消息"Hello,World"可能会显示为"Ifmmp,Xpsme"

为了获得字符串的实际长度NSMakeRange,请使用NSAttributedString.lengthInt("\(contents.endIndex)").

所以,代码应该是这样的

let attributedString = NSMutableAttributedString(string: contents)

attributedString.addAttribute(
    NSForegroundColorAttributeName,
    value: UIColor.white,
    range: NSMakeRange(0, attributedString.length)
)

label.attributedText = attributedString
Run Code Online (Sandbox Code Playgroud)

现在,这将生成格式正确的文本

在此输入图像描述

  • 您的解决方案是正确的,但可以改进解释(什么是UTF字符?). - `String.characters.count`计算扩展的字形集群,而NSRange与NSString相关,并计算UTF-16代码点.因此,另一种解决方案是使用`NSMakeRange(0,contents.utf16.count)`,如http://stackoverflow.com/a/30845969/1187415. (3认同)