Jak zlokalizować CGRect dla podciągu tekstu w UILabel?
Dla danegoNSRange
, Chciałbym znaleźćCGRect
wUILabel
to odpowiada glifom tegoNSRange
. Na przykład chciałbym znaleźćCGRect
który zawiera słowo „pies” w zdaniu „Szybki brązowy lis przeskakuje nad leniwym psem”.
Sztuczka polega na tymUILabel
ma wiele linii, a tekst jest naprawdęattributedText
, więc trudno jest znaleźć dokładne położenie ciągu.
Metoda, którą chciałbym napisać na moimUILabel
podklasa wyglądałaby mniej więcej tak:
- (CGRect)rectForSubstringWithRange:(NSRange)range;
Szczegóły dla zainteresowanych:
Moim celem jest być w staniestwórz nowy UILabel o dokładnym wyglądzie i pozycji UILabel, który mogę następnie animować. Resztę wymyśliłem, ale to właśnie ten krok powstrzymuje mnie w tej chwili.
Co zrobiłem, aby spróbować rozwiązać problem do tej pory:
Miałem nadzieję, że w systemie iOS 7 będzie trochę tekstu, który rozwiąże ten problem, ale większość każdego przykładu, który widziałem w Text Kit, skupia się naUITextView
iUITextField
raczej niżUILabel
.Widziałem tutaj kolejne pytanie dotyczące Stack Overflow, które obiecuje rozwiązać problem, ale zaakceptowana odpowiedź ma ponad dwa lata, a kod nie działa dobrze z tekstem przypisanym.Założę się, że właściwa odpowiedź na to wymaga jednego z następujących:
Używanie standardowej metody Text Kit do rozwiązania tego problemu w jednym wierszu kodu. Założę się, że to pociągnie za sobąNSLayoutManager
itextContainerForGlyphAtIndex:effectiveRange
Pisanie złożonej metody, która dzieli UILabel na linie i znajduje poprawkę glifu w linii, prawdopodobnie przy użyciu metod Core Text. Moim najlepszym rozwiązaniem jest rozbicie@ mattt's doskonałyTTTAttributedLabel, która ma metodę, która znajduje glif w punkcie - jeśli to odwrócę i znajdę punkt dla glifu, który może działać.Aktualizacja: Oto github gist z trzema rzeczami, które próbowałem rozwiązać, aby rozwiązać ten problem:https://gist.github.com/bryanjclark/7036101