2010-09-26 18 views
10

Ecco uno screenshot del Twitter app per riferimento: http://screencast.com/t/YmFmYmI4MiPhone CoreText: Trova le coordinate dei pixel di una stringa

Quello che voglio fare è posto un pop-over che galleggia sulla cima di una stringa in un NSAttributedString che potrebbe si estende su più righe. NSAttributedString è un requisito per il progetto.

Nello screenshot fornito, è possibile vedere che i collegamenti sono evidenziati in background, quindi mi porta a credere che stiano usando CoreText e NSAttributedStrings. Ho anche trovato qualcosa chiamato CTRunRef (http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html) che sembra promettente, ma ho difficoltà a montarlo concettualmente.

In breve, se ho un paragrafo nel testo principale e quando tocco una parola, come trovo il riquadro di delimitazione per quella parola?

risposta

8

impostare alcuni attributi nella stringa attribuito che non avrà effetto di visualizzazione, ma causerà che sia presentata come una corsa glifo separato, quindi utilizzare CoreText al layout della stringa

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

Ora si dovrà cacciare attraverso la cornice per trovare il pezzo rilevante di testo. Ottieni l'array di CTLineRef s con CTFrameGetLines().

Iterate attraverso l'array, verificando se il tocco era su quella linea, verificando che si trova all'interno del rect restituito da CTLineGetImageBounds(). Se lo è, ora guarda attraverso il glifo scorre sulla linea.

Ancora, è possibile ottenere una serie di CTRunRef s con CTLineGetGlyphRuns(). Controllare se il rubinetto era all'interno del glifo eseguito con CTRunGetImageBounds() e, in tal caso, è possibile trovare l'intervallo di indici nella stringa attribuita originale a cui corrisponde l'esecuzione del glifo con CTRunGetStringIndices().

3

è necessario trovare Y con CTLine e X con CTRun larghezza e altezza che è possibile ottenere tramite parola e carattere stesso. Ill attache il mio link al progetto, è un codice davvero semplice ma puoi reedit per soddisfare le tue esigenze. spero che aiuti gli evviva se migliori la logica generale per favore fammi sapere grazie. textViewProject

+0

Si prega di non chiedere nelle risposte. Crea una nuova domanda e link qui. – vikingosegundo

+0

vikingosegundo - questo in realtà sembra una risposta valida. Grazie per il link George! – jtrim

+0

siete invitati a farmi sapere se avete domande. –

0

Ho lavorato a una piccola libreria che fa esattamente questo. Potete trovare qui: https://github.com/pothibo/CMFramework

Tuttavia, questa biblioteca è nella sua fase alpha, c'è l'ottimizzazione necessaria e qualche caratteristica mancano (altezza della linea è una delle caratteristiche urgente voglio aggiungere)

Se si decide per usarlo e trovare un problema, non esitate a postare problemi su github!

2

Il collegamento fornito da George è stato molto utile e mi ha ottenuto quello che volevo. Ma è successa una cosa strana. Stava funzionando in iOS SDK 4.0 ma nell'iOS SDK 5 la posizione del collegamento appariva nella posizione sbagliata sulla vista.

Quindi ho dovuto modificare leggermente il codice. Per le coordinate x del pulsante tangibile, ho dovuto utilizzare CTRunGetTypographicBounds anziché la funzione CTRunGetImageBounds.

Quindi su tutti, il codice ottimizzato: la coordinata y, la larghezza e l'altezza è stato calcolato utilizzando CTRunGetImageBounds. E la coordinata x è stata calcolata utilizzando CTRunGetTypographicBounds.

Problemi correlati