我在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的UITextField属性,它就不会将NSTextAttachment作为其文本的一部分。此外,复制内容将EmojiTextAttachment复制为数据。在这里,我尝试设置数据:ofType:是一个字符串(转换为数据),但这不起作用,它只是形成了一些数据。通过emojiTextAttachment.image设置图像意味着它会粘贴图像。通过imageForBounds:textContainer:characterIndex:函数设置它意味着图像本身不会被复制/粘贴。
是否有一种方法可以设置NSTextAttachment的明文表示,或者其他一些已知的方法来实现这一工作?
发布于 2017-06-04 08:07:29
却找不到真正干净的方法。子类NSAttributedString不受支持,因此无法重写string函数。
相反,我使用一个NSAttributedString函数添加了一个plaintextRepresentation扩展,该函数通过属性枚举,用表情符号替换任何EmojiTextAttachments,然后返回属性字符串的string值。
https://stackoverflow.com/questions/44343855
复制相似问题