我正在使用我自己的自定义表情符号替换UILabel / UITextView中的表情符号。这很好用,但我正在努力的是让原始的表情符号粘贴。
因此,例如UILabel可能会显示“Hello”,使用自定义表情符号,复制然后粘贴该文本,或调用UILabel的text
属性将使用标准表情符号显示“Hello”。
我正在使用NSTextAttachment的子类来实现它,它显示一个图像,并在每次使用表情符号时将其添加为NSAttributedString:
class EmojiTextAttachment: NSTextAttachment {
static let size = CGSize(width: 16, height: 16)
let emoji: Emoji
init(emoji: Emoji) {
self.emoji = emoji
super.init(data: emoji.rawValue.data(using: .utf8), ofType: "public.text")
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func image(forBounds imageBounds: CGRect, textContainer: NSTextContainer?, characterIndex charIndex: Int) -> UIImage? {
return Emoji.generateConstrainedFaceImage(emoji: emoji, height: imageBounds.size.height)
}
}
let emoji = Emoji(rawValue: emojiString)!
let emojiTextAttachment = EmojiTextAttachment(emoji: emoji)
emojiTextAttachment.bounds = CGRect(x: 0, y: self.font!.descender, width: self.font!.lineHeight, height: self.font!.lineHeight)
let attributedString = NSAttributedString(attachment: emojiTextAttachment)
这看起来是正确的,但现在如果我调用UITextField的text
属性,它不会将NSTextAttachment作为其“文本”的一部分。此外,复制内容会将EmojiTextAttachment复制为数据。在这里,我试图设置数据:ofType:是一个字符串(转换为数据),但是这不起作用,它只是形成一些被pated的数据。通过emojiTextAttachment.image
设置图片意味着它会粘贴图片。通过imageForBounds:textContainer:characterIndex:
功能进行设置意味着不会复制/粘贴图像本身。
有没有办法可以设置NSTextAttachment的明文表示,或者其他一些已知的方法来使其工作?
答案 0 :(得分:0)
无法找到一种非常干净的方法。不支持对NSAttributedString进行子类化,因此无法覆盖string
函数。
相反,我添加了带有plaintextRepresentation
函数的NSAttributedString的扩展,它通过属性枚举,用表情符号本身替换任何EmojiTextAttachments,然后返回属性的string
值字符串。