2017-06-03 1 views
1

Je remplace un emoji dans un UILabel/UITextView avec mes propres emoji personnalisés. Cela fonctionne bien, mais ce que je lutte avec est d'obtenir l'emoji original à coller. Par exemple, si UILabel peut afficher "Hello", avec un emoji personnalisé, copier, puis coller ce texte, ou appeler la propriété text de l'UILabel affichera "Hello" avec l'emoji standard.Remplacement d'emoji dans UILabel avec NSTextAttachment - impossible de rétablir la représentation en texte brut dans les emoji ordinaires pour copier/coller

J'application de la présente sous-classe de l'aide d'une NSTextAttachment qui affiche une image, et l'ajouter comme NSAttributedString chaque fois que le emoji est utilisé:

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) 

Cela semble bien, mais maintenant si je l'appelle la propriété text de l'UITextField, il n'inclut pas le NSTextAttachment dans son 'texte. En outre, la copie du contenu copie l'EmojiTextAttachment en tant que données. Ici, j'ai essayé de définir les données: ofType: pour être une chaîne (convertie en données), mais cela n'a pas fonctionné, cela forme juste des données qui sont pated. Et le réglage de l'image par emojiTextAttachment.image signifie que l'image serait collée. Le réglage à travers la fonction imageForBounds:textContainer:characterIndex: signifie que l'image elle-même n'est pas copiée/collée.

Est-il possible que je peux définir la représentation d'un texte clair NSTextAttachment, ou d'une autre manière connue de faire ce travail?

+0

'J'appelle la propriété' text' de l'UITextField, elle n'inclut pas le NSTextAttachment dans son 'text': Parce que vous devez appeler la propriété 'attributeText' du UITextField. Sinon, c'est comme utiliser la propriété 'string' de votre' NSAttributedString'. Par exemple, si à la fin de votre code, vous faites 'let string = attributeString.string', vous ne devriez pas le trouver. – Larme

+0

Droite - si je mets l'image par 'emojiTextAttachment.image', l'image sera collée, si je ne le fais pas elle ne colle rien. Mon but est de coller l'emoji original. – Andrew

Répondre

0

Impossible de trouver une manière vraiment propre de le faire. Sous-classe NSAttributedString n'est pas supporté, donc aucun moyen de surcharger la fonction string.

Au lieu de cela, je l'ai ajouté une extension de NSAttributedString avec une fonction plaintextRepresentation, qui énumère à travers les attributs, remplaçant tout EmojiTextAttachments le emoji lui-même, puis retourne la valeur string de la chaîne attribuée.