2017-06-03 1 views
1

Ich ersetze Emoji innerhalb einer UILabel/UITextView mit meinem eigenen benutzerdefinierten Emoji. Das funktioniert gut, aber ich versuche, das ursprüngliche Emoji einzufügen.Ersetzen von Emoji in UILabel mit NSTextAttachment - nicht in der Lage, die Klartextdarstellung zurück zum regulären Emoji zum Kopieren/Einfügen

So zum Beispiel, wo die UILabel "Hallo" anzeigen, mit einem benutzerdefinierten Emoji, Kopieren und Einfügen dann diesen Text, oder Aufruf der text Eigenschaft des UILabel würde "Hallo" mit dem Standard-Emoji anzeigen.

Ich bin die Umsetzung dieses eine Unterklasse von NSTextAttachment verwendet, die ein Bild anzeigt, und als NSAttributedString Zugabe, wenn die Emoji verwendet wird:

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) 

Dies scheint richtig, aber jetzt, wenn ich die text Eigenschaft nennen des UITextFields enthält es NSTextAttachment nicht als Teil seines Textes. Darüber hinaus kopiert das Kopieren des Inhalts das EmojiTextAttachment als Daten. Hier habe ich versucht, die Daten: ofType: als eine Zeichenfolge (in Daten konvertiert), aber das hat nicht funktioniert, es bildet nur einige Daten, die pated ist. Wenn Sie das Bild auf emojiTextAttachment.image setzen, wird das Bild eingefügt. Wenn Sie sie über die Funktion imageForBounds:textContainer:characterIndex: einstellen, wird das Bild selbst nicht kopiert/eingefügt.

Gibt es eine Möglichkeit, dass ich die Klartextdarstellung einer NSTextAttachment, oder eine andere bekannte Möglichkeit, dies funktioniert zu setzen?

+0

'Ich rufe die' text' -Eigenschaft des UITextField auf, es enthält nicht NSTextAttachment als Teil seines 'text': Weil Sie die' attributierteText'-Eigenschaft des UITextField aufrufen müssen. Sonst ist es, als würde man die 'string' -Eigenschaft von' NSAttributedString' verwenden. Zum Beispiel, wenn Sie am Ende von Ihnen, let string = attributedString.string', Sie sollten es nicht finden. – Larme

+0

Richtig - wenn ich das Bild über 'emojiTextAttachment.image' setze, würde es das Bild einfügen, wenn ich es nicht mache, dann fügt es nichts hinzu. Mein Ziel ist es, das ursprüngliche Emoji einzufügen. – Andrew

Antwort

0

Konnte keinen wirklich sauberen Weg finden, es zu tun. Das Subclassing von NSAttributedString wird nicht unterstützt, daher kann die Funktion string nicht überschrieben werden.

Stattdessen habe ich eine Verlängerung mit einer NSAttributedString plaintextRepresentation Funktion hinzugefügt, die die Attribute Zählen, irgendein EmojiTextAttachments mit dem emoji ersetzen selbst, gibt dann den Wert des string zurückzuführen String.