Wie finde ich das CGRect für eine Teilzeichenfolge von Text in einem UILabel?

Für ein gegebenesNSRangeIch 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 wirklichattributedTextDaher 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:effectiveRangeSchreiben 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

Antworten auf die Frage(9)

Ihre Antwort auf die Frage