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

Swift NSAttributedString和表情符号:我从未设置的范围似乎已设置,swift,nsattributedstring,emoji,Swift,Nsattributedstring,Emoji,这是最奇怪的问题(XCode 10.2.1): let a=“String with emoji显示问题发生在属性字符串的显示中。如果在UITextView中使用属性字符串,也会发生这种情况。但问题不会发生在UILabel中 如果为属性字符串指定字体,所有显示问题都会消失 添加: nsa.addAttributes([.font: UIFont.systemFont(ofSize: 16)], range: NSRange(location: 0, length: nsa.string.

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


let a=“String with emoji显示问题发生在属性字符串的显示中。如果在UITextView中使用属性字符串,也会发生这种情况。但问题不会发生在UILabel中

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

添加:

nsa.addAttributes([.font: UIFont.systemFont(ofSize: 16)],
    range: NSRange(location: 0, length: nsa.string.utf16.count))
添加两个字符串后,所有问题都会消失。显然,您应该使用所需的任何字体


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

以下是苹果的官方答案:

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

因为应用程序没有明确指定属性化字体 字符串,它依赖于字体回退系统

建议自启动后始终指定字体属性 文本系统的上下文性质可能会产生意外的结果 像这样

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


这太可怕了。

奇怪的是,即使您删除了对
addAttributes
的调用,字符串显示也不正确。简单地附加这两个字符串是一个问题。在iOS模拟器中显示的UILabel中,结果在我看来是正确的,因此这似乎是Xcode游乐场的问题。如果您在属性字符串,很好。这只是属性字符串的游乐场显示中的一个问题。它发生在游乐场中的UITextView上。没有在模拟器中尝试过。即使它只是游乐场,我真的鼓励在bugreport.apple.com打开一个缺陷。游乐场应该正确显示。苹果已经非常清楚,包括在WWDC 2018视频中,您不应该依赖默认属性来实现预期的效果。当然,这可能会让人感到意外,也可能有点烦人,但rmaddy已经告诉了您答案,因此可能没有理由进行无缘无故的表情。您学到了一些有用的东西;这不是我们来这里的目的吗?使用utf16 i事实上,对于包含表情符号的字符串(因为“字符”的长度很奇怪),建议您使用它,谢谢您指出这一点!这个答案帮助我解决了NSAttributedStrings和emojis的问题。干杯