Ich färbe einige Teile eines Textes aus einer API (denke "@mention" wie auf Twitter) mit NSAttributedString.NSAttributedString und emojis: Problem mit Positionen und Längen
Die API gibt mir den Text und ein Array von Entitäten, die die Teile des Textes darstellen, die erwähnt werden (oder Links, Tags, etc.), die farbig sein sollten.
Aber manchmal ist die Färbung wegen Emojis versetzt.
Zum Beispiel mit diesem Text: "@ericd Some Text @apero"
die API gibt:
[ { " text ":" ericd ", " len ": 6, " pos ": 0 }, { "text": "apero" "len": 6, "po": 18 } ]
, die ich mit einem NSAttributedString Verwendung NSRange erfolgreich übersetzen:
for m in entities.mentions {
let r = NSMakeRange(m.pos, m.len)
myAttributedString.addAttribute(NSForegroundColorAttributeName, value: someValue, range: r)
}
Wir sehen, dass "pos": 18
korrekt ist, hier beginnt "@apero". Die farbigen Teile sind wie erwartet "@ericd" und "@apero".
"Some Text @ericd ✌ @apero."
:aber, wenn einige spezifische Kombinationen von Emojis im Text verwendet werden, wird die API übersetzen nicht gut auf NSAttributedString wird die Färbung Offset
gibt:
[ { "text": "ericd", "len": 6, "po": 0 }, { "text": "apero" "len": 6, "po": 22 } ]
"pos": 22
: der API-Autor gibt an, dass dies korrekt ist, und ich verstehe ihre Sichtweise.
Leider hat NSAttributedString nicht einverstanden sind, meine Färbung ist aus:
Die letzten Zeichen für die zweite Erwähnung nicht gefärbt sind (weil die „pos“ zu kurz ist, weil der Emojis ?).
Wie Sie vielleicht bereits erraten haben, kann ich in keiner Weise die Art, wie sich die API verhält, ändern, ich muss mich auf der Client-Seite anpassen.
Außer dass ... Ich habe keine Ahnung, was zu tun ist. Soll ich herausfinden, welche Art von Emojis im Text enthalten ist, und die Position von Erwähnungen manuell ändern, wenn es ein problematisches Emoji gibt? Aber was wären die Kriterien, um festzustellen, welches Emoji die Position verschiebt und welches nicht? Und wie entscheidet man, wie viel Offset ich brauche? Vielleicht wird das Problem von NSAttributedString verursacht?
Ich verstehe, dass dies auf die Emojis Länge einmal im Vergleich zu ihrer Länge als getrennte Zeichen verwandt ist, aber ... nun ja ... Ich bin verloren (Seufzer).
Bitte beachte, dass ich versucht habe, eine Lösung ähnlich wie this stuff zu implementieren, da mein API mit diesem kompatibel ist, aber es funktionierte nur teilweise einige Emojis waren noch brechen die Indizes:
Interessant! (Der Bereich, den ich verwende, ist bereits ein NSRange, aber kein Swift Range). Ich werde etwas Zeit brauchen, um dies zu studieren und Tests durchzuführen, um zu sehen, wie es sich im Vergleich zur API, die ich anrufe, verhält.Danke, ich gebe Feedback wenn möglich. – Moritz
In Ihrem Beispiel, wenn Sie pos 22 und len 6 verwenden, wie meine API für denselben Text, wird "@apero" erst nach dem "@" (anstatt der gesamten Erwähnung) farbig dargestellt (https://www.evernote.com)/l/AOznB6IhPzxJrbvva5Jxx24cyFv9MrhSqkI). – Moritz
@EricAya: Aber das "@" von "@apero" ist auf Position 21, nicht 22. Oder wie zählt man die Charaktere? –