Wie finde ich das CGRect für eine Teilzeichenfolge von Text in einem UILabel?
Für ein gegebenesNSRange
Ich würde gerne eine findenCGRect
in einemUILabel
das entspricht den Glyphen davonNSRange
. Ich würde zum Beispiel gerne das findenCGRect
das enthält das Wort "Hund" im Satz "Der schnelle braune Fuchs springt über den faulen Hund."
Der Trick ist derUILabel
hat mehrere Zeilen, und der Text ist wirklichattributedText
Daher ist es etwas schwierig, die genaue Position der Saite zu finden.
Die Methode, die ich auf meine schreiben möchteUILabel
Die Unterklasse würde ungefähr so aussehen:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
Details, für Interessierte:
Mein Ziel dabei ist es zu könnenerstelle ein neues UILabel mit dem genauen Aussehen und der Position des UILabels, 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 daraufUITextView
undUITextField
, eher, alsUILabel
.Ich habe hier eine weitere Frage zu Stack Overflow gesehen, die das Problem lösen soll, aber die akzeptierte Antwort ist über zwei Jahre alt, und der Code funktioniert mit zugeschriebenem Text nicht gut.Ich wette, dass die richtige Antwort auf diese Frage eine der folgenden Antworten beinhaltet:
Verwenden Sie eine Standard-Textkit-Methode, um dieses Problem in einer einzigen Codezeile zu lösen. Ich wette, es würde beinhaltenNSLayoutManager
undtextContainerForGlyphAtIndex:effectiveRange
Schreiben einer komplexen Methode, die das UILabel in Zeilen aufteilt und das Rect eines Glyphen innerhalb einer Zeile findet, wahrscheinlich unter Verwendung von Core-Text-Methoden. Meine derzeit beste Wette ist das Auseinandernehmen@ mattts AusgezeichnetTTTAttributedLabel, die eine Methode hat, die an einem Punkt eine Glyphe findet - wenn ich das invertiere und den Punkt für eine Glyphe finde, könnte das funktionieren.Update: Hier ist ein Überblick über die drei Dinge, die ich bisher versucht habe, um dieses Problem zu lösen:https://gist.github.com/bryanjclark/7036101