Jak uzyskać CGRect
z NSRange
dla tekstu renderowanego za pomocą Core Text?Tekst rdzenia - Uzyskaj współrzędne pikseli z NSRange
Używam Core Text z NSAttributedString
.
Jak uzyskać CGRect
z NSRange
dla tekstu renderowanego za pomocą Core Text?Tekst rdzenia - Uzyskaj współrzędne pikseli z NSRange
Używam Core Text z NSAttributedString
.
To jest absolutny ból, ale można zrobić.
Musisz dostać wszystkie linie w ramce przy użyciu CTFrameGetLines()
sprawdzić, czy ich zakres znaków mieści się w zakresie, którego szukasz używając CTLineGetStringRange()
użyć CTLineGetTypographicBounds()
znaleźć jak duży sama linia uczyniłoby jak i użytkowania CTLineGetOffsetForStringIndex()
, aby określić faktyczną pozycję początku/końca znaku zakresu (jeśli linia jest tylko podzakresem pożądanego zakresu).
Łącząc to wszystko i dodając przesunięcia i wysokości, możesz uzyskać to, czego potrzebujesz. Zauważ, że CTLineGetImageBounds()
nie działa bez kontekstu graficznego (i, z tego co wiem, jest i tak dość drogi) i nie jest konieczne, aby rozwiązać ten problem.
FIrst określa linię (linie), w której zakres, którym jesteś zainteresowany kłamstw. Następnie wywołaj CTLineGetOffsetForStringIndex()
, aby uzyskać przesunięcie określonej pozycji łańcucha od początku linii. Razem z CTLineGetImageBounds()
, powinno być możliwe obliczenie pozycji pierwszego i ostatniego znaku z twojego zakresu.
Szczegółowa odpowiedź, bardzo dziękuję! Zawsze trudno jest znaleźć wszystkie funkcje potrzebne do takich rzeczy. :) – Joshua
@ Joshua można udzielić ur code podczas realizacji tej odpowiedzi? Myślę, że mam jakiś problem i nie mogę go rozwiązać przez 3 tygodnie, pomóżcie mi, proszę ... –
@Risma Nigdy tak naprawdę nie dostałem się do realizacji tego, ale wszystko, czego potrzebujesz, jest w odpowiedzi Seana. – Joshua