Für eine gegebene NSRange
würde ich gerne ein CGRect
in einem finden UILabel
, das den Glyphen davon entspricht NSRange
. Zum Beispiel möchte ich das finden CGRect
, das das Wort "Hund" im Satz "Der schnelle braune Fuchs springt über den faulen Hund" enthält.
Der Trick ist, dass der UILabel
Text mehrere Zeilen hat und der Text wirklich ist. Daher attributedText
ist es etwas schwierig, die genaue Position der Zeichenfolge zu finden.
Die Methode, die ich in meine UILabel
Unterklasse schreiben möchte, würde ungefähr so aussehen:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
Details für Interessierte:
Mein Ziel dabei ist es , ein neues UILabel mit dem genauen Erscheinungsbild und der Position des UILabels erstellen zu können, das ich dann animieren kann. Ich habe den Rest herausgefunden, aber gerade dieser Schritt hält mich im Moment zurück.
Was ich bisher getan habe, um das Problem zu lösen:
- Ich hatte gehofft, dass es mit iOS 7 ein bisschen Text Kit geben würde, das dieses Problem lösen würde, aber fast jedes Beispiel, das ich mit Text Kit gesehen habe, konzentriert sich auf
UITextView
undUITextField
anstatt aufUILabel
. - Ich habe hier eine andere Frage zu Stack Overflow gesehen, die verspricht, das Problem zu lösen, aber die akzeptierte Antwort ist über zwei Jahre alt und der Code funktioniert mit zugeordnetem Text nicht gut.
Ich wette, dass die richtige Antwort darauf eine der folgenden beinhaltet:
- Verwenden einer Standard-Text-Kit-Methode, um dieses Problem in einer einzigen Codezeile zu lösen. Ich wette, es würde
NSLayoutManager
und beinhaltentextContainerForGlyphAtIndex:effectiveRange
- Schreiben einer komplexen Methode, die das UILabel in Zeilen aufteilt und das Rechteck eines Glyphen innerhalb einer Zeile findet, wahrscheinlich unter Verwendung von Core-Text-Methoden. Meine derzeit beste Wette ist es, @ mattts exzellentes TTTAttributedLabel zu zerlegen , das eine Methode hat, die eine Glyphe an einem Punkt findet - wenn ich das invertiere und den Punkt für eine Glyphe finde, könnte das funktionieren.
Update: Hier ist ein Github-Kern mit den drei Dingen, die ich bisher versucht habe, um dieses Problem zu lösen: https://gist.github.com/bryanjclark/7036101