2012-07-14 9 views
12

Ho chiesto a uno sviluppatore (TwoLivesLeft, i creatori di Codea) come hanno evidenziato la sintassi nella loro app. Ha risposto:Ottieni le coordinate X e Y di una parola in UITextView

@ TD2 l'editor di Codea viene implementato utilizzando un UITextView. L'evidenziazione viene eseguita sovrapponendo le sottoview nelle posizioni appropriate di , in genere UILabels. Vengono rimossi dal pool di riutilizzo, , in modo simile al funzionamento di UITableViewCells. Durante lo scorrimento, le linee che richiedono il ri-evidenziamento dei marcatori di tiro fuori dal pool e le linee che sono state spostate dallo schermo fuori dallo schermo riportano i loro indicatori nel pool.

Qualcuno può spiegare come ottenere la xey di una determinata parola?

+0

Ecco come. https://discussions.apple.com/thread/2511930?start=0&tstart=0 –

risposta

33

UITextView è conforme a UITextInput, di cui è possibile trovare una descrizione dettagliata here.

Date un'occhiata ai metodi richiesti "textRangeFromPosition: toPosition:", "positionFromPosition: offset:", "positionFromPosition: inDirection: offset:", e alcuni degli altri metodi geometrici basati nel protocollo UITextInput. Quelli potrebbero fornire la funzionalità che stai cercando.

Non ho effettivamente provato a fare in modo che funzionino come vuoi tu, ma sembra proprio quello che ti serve.

Fammi sapere se hai bisogno di ulteriore aiuto!


UPDATE:

Ecco alcuni esempi di codice di come fare questo. Ho finito per ottenere il metodo "firstRectForRange:" per funzionare. Questo codice prende sostanzialmente le ultime tre lettere di UITextView "textStuff" e lo evidenzia in verde.

UITextView *textStuff = [[UITextView alloc] init]; 
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0); 
textStuff.text = @"how are you today?"; 
textStuff.textColor = [UIColor blackColor]; 

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil]; 
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3]; 

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2]; 

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ]; 

NSLog(@"%f, %f", result1.origin.x, result1.origin.y); 

UIView *view1 = [[UIView alloc] initWithFrame:result1]; 
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f]; 
[textStuff addSubview:view1]; 

risultato dell'esecuzione di questo codice:

enter image description here

+0

Hai un codice di partenza che potrebbe darmi qualcosa da cui spingere? – Sirens

+0

Ho aggiornato la risposta con un codice di esempio. Inizia da lì e modificalo per farlo funzionare nel modo desiderato. – bddicken

+0

Questo lavoro ha funzionato? Ti sarei grato se accettassi la risposta in tal caso. – bddicken

5

@ di bddicken https://stackoverflow.com/a/11487125/3549781 funziona come un fascino. Ma il problema è che non funziona su iOS 7+ se il testo contiene una nuova riga "\ n". Dopo molte ricerche ho trovato una soluzione per questo.

si deve garantire il layout di textView prima di chiamare firstRectForRange: da

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

Cortesia: UITextView firstRectForRange not working when there's new line characters in the mix

P.S: In un primo momento ho aggiunto questo come un commento a @ di bddicken risposta. Poiché la maggior parte delle persone non legge i commenti, ho aggiunto questo come risposta.

Problemi correlati