2010-12-18 18 views

Odpowiedz

9

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.

+0

Szczegółowa odpowiedź, bardzo dziękuję! Zawsze trudno jest znaleźć wszystkie funkcje potrzebne do takich rzeczy. :) – Joshua

+1

@ 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ę ... –

+0

@Risma Nigdy tak naprawdę nie dostałem się do realizacji tego, ale wszystko, czego potrzebujesz, jest w odpowiedzi Seana. – Joshua

2

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.

Powiązane problemy