在UILabel上使用NSMutableAttributedString时表情符号丢失

时间:2018-06-20 18:55:56

标签: ios swift uilabel nsattributedstring nsmutableattributedstring

在使用NSMutableAttributedString在UILabel上设置文本部分时,我遇到了一些奇怪的问题。它显示了一些特定表情符号的奇异符号。这是我使用的代码和问题的屏幕截图。

guard var _comment = comment.comment ,let _username = comment.userName else { return }
var username = NSMutableAttributedString.init(string: _username)
var commentText = NSMutableAttributedString.init(string: _comment)
var commentTotal = NSMutableAttributedString.init()
commentTotal.append(username)
commentTotal.append(commentText)
self.userNameLabel.attributedText = commentTotal

屏幕截图:

enter image description here

但是,如果我不使用NSMutableAttributedString像这样直接放置字符串:

self.userName.text = _comment

此输出显示正确的表情符号,没有问题 。这是什么问题?有任何建议吗? enter image description here

这是设置字体的代码:

if let font = UIFont.init(name: "Montserrat-Bold", size: self.userNameLabel.font.pointSize){
        username.addAttribute(NSFontAttributeName, value: font, range: NSRange.init(location: 0, length: _username.count))
        username.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0), range: NSRange.init(location: 0, length: _username.count))
    }



if let font = UIFont.init(name: "Montserrat-Medium", size: self.userNameLabel.font.pointSize-1){
                    commentText.addAttribute(NSFontAttributeName, value: font, range: NSRange.init(location: 0, length: commentString.count))
                    commentText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0), range: NSRange.init(location: 0, length: commentString.count))
                }

故事板图片: enter image description here

2 个答案:

答案 0 :(得分:7)

设置属性时,您的问题出在NSRange计算上。 NS[Mutable]AttributeString需要NSRange基于NSString范围,而不是String范围。

所以代码如下:

NSRange.init(location: 0, length: commentString.count)

需要这样写:

NSRange(location: 0, length: (commentString as NSString).length)

或:

NSRange(location: 0, length: commentString.utf16.count)

以下内容说明了commentString.count的问题:

let comment = ""
print(comment.count) // 3
print((comment as NSString).length) // 6
print(comment.utf16.count) // 6

这就是为什么您的代码似乎将中间字符分成两半的原因。您正在传递所需长度的一半(在这种情况下)。

答案 1 :(得分:2)

在Swift 4中执行此操作的正确方法是使用String上的索引:

NSRange(location: 0, length: commentString.endIndex.encodedOffset)