NSAttributedString和表情符号:我从未设置的范围似乎已设置

时间:2019-05-02 18:30:25

标签: swift nsattributedstring emoji

这是最奇怪的问题(XCode 10.2.1运动场):

let a = "String with emoji "
var b = "00:00 0000"

var nsa = NSMutableAttributedString(string: a)
var nsb = NSMutableAttributedString(string: b)
nsb.addAttributes([.foregroundColor: UIColor.red], 
                  range: NSRange(location: 0, length: nsb.length))
nsa.append(nsb)

nsa看起来像这样:

enter image description here

表情符号后的00具有与表情符号字符相同的宽度和高度。但这变得奇怪了。该效果仅扩展到数字0-9,空格和井号(#)字符。如果我将00:00 0000替换为其他字符串,那么一切都将完全正常:

enter image description here

似乎内部NSMutableAttributedString将属性应用于表情符号字符,然后错误地将其扩展到由某些字符组成的附加字符串的前缀。

这是一个已知问题吗?通过在第一个字符串a + "\u{2009}"后面加上一个不间断的细空格字符,我找到了一种解决方法。在Swift中,有没有更好的方法来处理表情符号怪异现象?

2 个答案:

答案 0 :(得分:0)

显示问题发生在属性字符串的运动场显示中。如果在UITextView中使用属性字符串,也会发生这种情况。但是问题不会在UILabel中发生。

如果为属性字符串提供字体,所有显示问题都会消失。

添加:

nsa.addAttributes([.font: UIFont.systemFont(ofSize: 16)],
    range: NSRange(location: 0, length: nsa.string.utf16.count))
附加两个字符串后的

使所有问题都消失了。显然,您应该使用任何想要的字体。

您应该始终将字体应用于属性字符串,以便UI组件知道如何正确显示属性字符串的内容。

答案 1 :(得分:-1)

这是苹果公司的官方答案:

  

我们确定这是您需要解决的问题。

     

由于应用未明确指定属性的字体   字符串,这取决于字体后备系统。

     

建议自从   文本系统的上下文性质可能会产生意外结果   这样。

     

请通过更新告知我们是否为您解决了该问题   您的错误报告。

这真是令人震惊。