カスタム NSTextStorage サブクラスの絵文字に問題があります。このクラスは、渡された属性を保存しません。代わりに、独自のものを生成します。
override func attributesAtIndex(location: Int, effectiveRange range: NSRangePointer) -> [String : AnyObject] {
if range != nil {
range.memory = NSMakeRange(0, self.string.length)
}
let attributes = [
NSFontAttributeName: NSFont.systemFontOfSize(14)
]
return attributes
}
override func setAttributes(attrs: [String : AnyObject]?, range: NSRange) {
// does nothing
}
これはほとんどうまくいきます。ただし、文字列に絵文字がある場合、それらは単に表示されません。NSTextView がテキスト ストレージに対して行う呼び出しを調べると、テキスト ビューは、絵文字が表示されるたびに、絵文字範囲のフォント属性を AppleColorEmoji フォントに設定しようとするようです。「真の属性」のソースとしてテキスト ビューに依存している場合は問題ありませんが、プログラムをそのように動作させたくありません。私の場合、テキスト ストレージは、すべての属性の唯一のベンダーである必要があります。テキストビューが送信するものを属性ごとにリッスンすることはできません。
文字列内の絵文字を手動で検出し、AppleColorEmoji フォントを手動で設定する必要がありますか? それとももっと良い方法がありますか?フォールバック フォントを使用して、欠落している文字を含むフォントを自動的に検索することは既に試しましたが、それらの方法を使用しても絵文字はカバーされないようです。