2011-12-30 14 views
7

Sto provando a visualizzare un UIPopoverController dal rect di un testo selezionato in un UITextView, Come posso ottenere il testo selezionato CGRect?Come posso ottenere la cornice di testo selezionata da UITextView

Grazie!

+0

Se questa domanda è ciò che penso che sia, UIPopoverController nel titolo è probabilmente fuorviante? Vuoi ottenere il CGPoint dalla selezione del testo, non è niente di speciale per UIPopoverController, giusto? – barley

+0

Risolto il problema in quanto il tuo suggerimento è valido @barley. – Till

risposta

33

Penso che [UITextInput selectedTextRange] e [UITextInput caretRectForPosition:] sia quello che stai cercando.

[UITextInput selectedTextRange] restituisce l'intervallo selezionato nel carattere

[UITextInput caretRectForPosition:] restituisce il CGRect dell'intervallo carattere in questo ingresso.

UITextView conforme a UITextInput (da iOS 5), quindi è possibile utilizzare questi metodi per l'istanza UITextView.

Sarà qualcosa di simile.

UITextRange * selectionRange = [textView selectedTextRange]; 
CGRect selectionStartRect = [textView caretRectForPosition:selectionRange.start]; 
CGRect selectionEndRect = [textView caretRectForPosition:selectionRange.end]; 
CGPoint selectionCenterPoint = (CGPoint){(selectionStartRect.origin.x + selectionEndRect.origin.x)/2,(selectionStartRect.origin.y + selectionStartRect.size.height/2)}; 

MODIFICA: poiché il codice di esempio è diventato un po 'difficile da ottenere, ho aggiunto un'immagine per l'integrazione.

An image that illustrates what local variables represent

+0

Piccolo problema, lo chiami punto centrale ma in realtà stai calcolando il punto in basso a destra. – Till

+0

@All'inizio, inizialmente pensavo che [UITextInput caretRectForPosition:] avesse UITextRange come input, ma (come suggerisce il nome) in realtà prende UITextPosition. Ho corretto il codice di esempio e penso che ora sia più preciso anche se un po 'più difficile da ottenere. E grazie per l'edizione! – barley

+0

Hai ancora un piccolo problema nel calcolo del centro: D ... controlla nuovamente la coordinata X, le parentesi sono impostate in modo errato per calcolare il centro. – Till

19

ci sono alcune situazioni in cui la risposta di orzo non sarà effettivamente dare al centro della selezione. Per esempio:

Screenshot showing an example of where using the caret rects would not be accurate

In questo caso si può vedere il menu Copia/Incolla viene visualizzato al centro della selezione, che si estende per l'intera larghezza del campo di testo. Ma il calcolo del centro dei due punti di riferimento del caret darebbe una posizione molto più a destra.

È possibile ottenere un risultato più preciso utilizzando selectionRectsForRange:

UITextRange *selectionRange = [textView selectedTextRange]; 
NSArray *selectionRects = [self.textView selectionRectsForRange:selectionRange]; 
CGRect completeRect = CGRectNull; 
for (UITextSelectionRect *selectionRect in selectionRects) { 
    if (CGRectIsNull(completeRect)) { 
     completeRect = selectionRect.rect; 
    } else completeRect = CGRectUnion(completeRect,selectionRect.rect); 
} 

Vale anche la pena chiarire che se si sta continuando a supportare iOS 4 e l'utilizzo di una di queste risposte, è necessario assicurarsi che questi metodi sono supportato prima di chiamarli: if ([textView respondsToSelector:@selector(selectedTextRange)]) { …

+0

Perfetto, ha funzionato come un fascino – aryaxt

+2

In realtà non è necessario il controllo per CGRectIsNull come CGRectUnion già gestisce questo. In base alla documentazione di CGRectUnion: "Se uno dei rettangoli è un rettangolo null, viene restituita una copia dell'altro rettangolo" –

Problemi correlati