2010-09-26 14 views
10

Oto zrzut ekranu z aplikacji Twitter dla odniesienia: http://screencast.com/t/YmFmYmI4MiPhone CoreText: Znajdź współrzędne piksela podciągu

Co chcę zrobić, to miejsce pływający pop-over na szczycie podciągu w NSAttributedString które mogłyby rozpiętość wielu linii. NSAttributedString jest wymaganiem dla projektu.

Na załączonym zrzucie ekranu widać, że linki są podświetlone na tle, więc pozwala mi sądzić, że używają one CoreText i NSAttributStrings. Znalazłem także coś, co nazywa się CTRunRef (http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html), co wygląda obiecująco, ale mam problem z dopasowaniem go do siebie koncepcyjnie.

Krótko mówiąc, jeśli mam akapit w tekście podstawowym i po dotknięciu słowa, jak znaleźć obwiednię dla tego słowa?

Odpowiedz

8

Ustaw jakiś atrybut w nadana ciąg, który nie wpłynie wyświetlacz, ale spowoduje to być określone jako oddzielne metę glifów, a następnie użyć CoreText do układu o jakieś

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); 
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 

Teraz trzeba będzie przeszukiwać ramkę, aby znaleźć odpowiednią porcję tekstu. Uzyskaj tablicę CTLineRef s z CTFrameGetLines().

Powtórzenie całej macierzy, sprawdzanie, czy dotknięcie było na tej linii, sprawdzając, czy znajduje się wewnątrz rect zwracanej przez CTLineGetImageBounds(). Jeśli tak, teraz przejrzyj przebiegi glifów w linii.

Ponownie, można uzyskać tablicę CTRunRef s z CTLineGetGlyphRuns(). Sprawdź, czy kliknięcie znajdowało się w kodzie Glifu pod numerem CTRunGetImageBounds(), a jeśli tak, to możesz znaleźć zakres indeksów w oryginalnym łańcuchu, któremu odpowiada przebieg glifu z CTRunGetStringIndices().

3

Musisz znaleźć Y przez CTLine i X przez CTRun szerokość i wysokość, które można uzyskać za pomocą samego słowa i czcionki. źle załączy mój link do projektu, jego naprawdę prosty kod, ale możesz go zmienić, aby spełnić twoje potrzeby. mam nadzieję, że pomaga to wiwatować, jeśli poprawisz ogólną logikę, proszę dać mi znać thx. textViewProject

+0

Proszę nie pytać w odpowiedziach. Utwórz nowe pytanie i link tutaj. – vikingosegundo

+0

vikingosegundo - to wygląda na prawidłową odpowiedź. Dzięki za link George! – jtrim

+0

serdecznie zapraszamy, daj mi znać, jeśli masz jakieś pytania. –

0

Pracowałem nad małą biblioteką, która dokładnie to robi. Można go znaleźć tutaj: https://github.com/pothibo/CMFramework

Jednak ta biblioteka jest w fazie alfa, jest optymalizacja potrzebne i niektórych funkcji brakuje (wysokość linii jest jednym z pilnych funkcji chcę dodać)

Jeśli zdecydujesz Aby go użyć i znaleźć problem, nie wahaj się publikować problemów na github!

2

Link podany przez George był bardzo pomocny i dał mi to, co chciałem. Ale wydarzyło się coś dziwnego. Pracował on w iOS SDK 4.0, ale w lokalizacji iOS SDK 5 pozycja łącza pojawiła się w niewłaściwym miejscu w widoku.

Musiałem więc trochę poprawić kod. Dla współrzędnych x przycisku touchable musiałem użyć funkcji CTRunGetTypographicBounds zamiast funkcji CTRunGetImageBounds.

zatem nad wszystkim, w kodzie tweaked: współrzędnej Y, szerokość i wysokość obliczono stosując CTRunGetImageBounds. Współrzędna x została obliczona przy użyciu CTRunGetTypographicBounds.