使用NSTextAttachment替换UILabel中的表情符号 - 无法将明文表示设置回常规表情符号进行复制/粘贴

时间:2017-06-03 12:19:25

标签: ios swift uilabel nsattributedstring nstextattachment

我正在使用我自己的自定义表情符号替换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的明文表示,或者其他一些已知的方法来使其工作?

1 个答案:

答案 0 :(得分:0)

无法找到一种非常干净的方法。不支持对NSAttributedString进行子类化,因此无法覆盖string函数。

相反,我添加了带有plaintextRepresentation函数的NSAttributedString的扩展,它通过属性枚举,用表情符号本身替换任何EmojiTextAttachments,然后返回属性的string值字符串。