2011-02-02 10 views
5

Ho un UITextView che è modificabile. Ora ho un requisito che mi obbliga a trovare (come e quando continuo a digitare) quando è iniziata la riga successiva (forse a causa del fatto che ho premuto il tasto Invio o un interruzione automatica del wordwrap). C'è qualche notifica che può essere ottenuta per capire quando la linea successiva è iniziata durante la digitazione?UITextView (modifica) - rilevamento dell'evento di riga successiva occorso

Ho provato a cercare soluzioni per trovare le posizioni del cursore all'interno di una vista testuale ma utilizzando selectedRange e le proprietà di posizione per scoprirlo non mi aiutano. Non esiste alcuna correlazione tra il valore della posizione e una nuova linea. Il valore della posizione continua ad aumentare durante la digitazione. Qualche idea?

Grazie!

risposta

2

rileverà linea cambia da qualsiasi cosa per colpire "ritorno", backspacing per ridurre la linea-count, battitura fino alla fine della linea e una parola -wrap si verifica, ecc. (* Nota: DEVE regolare le variabili per la dimensione del carattere, ti consiglio di non usare numeri codificati come nell'esempio qui sotto).

previousNumberOfLines = ((hiddenText.contentSize.height-37+21)/(21));//numbers will change according to font size 
NSLog(@"%i", previousNumberOfLines); 
10

Il seguente delegato viene chiamato ogni volta che viene immesso un nuovo testo in textView.

Impostare il delegato per UITextView, quindi codice come segue

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; 
{ 
    if ([text isEqualToString:@"\n"]) { 
     //Do whatever you want 
    } 
    return YES; 
} 
+2

Utilizzo già UITextViewTextDidChangeNotification. E come cerco un \ n nel testo? Non textView.text restituisce l'intero gruppo di testo digitato finora? Potrebbe essersi verificato un arresto automatico della riga, oppure avrei potuto colpire un sacco di spazi. Come posso rilevare l'arrivo della riga successiva in quel contesto? – Bourne

+0

@bourne: sì è il suo rilevamento solo la chiave di ritorno – KingofBliss

+5

Sì, sì. Ma rileva una nuova riga solo quando c'è una vista testo vuota e la prima cosa che si colpisce al suo interno è una chiave di ritorno. Sto cercando di gestire lo scenario wordWrap multilinea textView in cui il wordwrap causa automaticamente un'interruzione di riga. Desidero rilevare quell'evento in qualche modo. – Bourne

0

Aggiungi una seconda visualizzazione di testo nascosta alla visualizzazione. Implementare shouldChangeTextInRange per la vista di testo visibile e impostare il testo nella vista nascosta nel nuovo testo. Confrontare il contenuto Dimensione per il nuovo e il vecchio testo per rilevare il ritorno a capo automatico.

0
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 

    if ([text isEqualToString:@"\n"]) { 
     textView.text=[NSString stringWithFormat:@"%@\n",textView.text]; 
     // Return FALSE so that the final '\n' character doesn't get added 
     return NO; 
    } 
    // For any other character return TRUE so that the text gets added to the view 
    return YES; 
} 
0

Sono un po 'in ritardo alla festa, ma ho avuto un requisito analogo, e dopo un po' di indagini ho scoperto che KingofBliss 'risposta combinata con

-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByWordBeforeCharacterAtIndex:]; 
-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByHyphenatingBeforeCharacterAtIndex:]; 

ha fatto il trucco per me.

È possibile impostare qualsiasi oggetto come il delegato di s' UITextView gestore di layout in questo modo:

textView.textContainer.layoutManager.delegate = (id<NSLayoutManagerDelegate>)delegate 

auguriamo che questo si proverà utile.

4

Per uso Swift questo

previousRect = CGRectZero 

func textViewDidChange(textView: UITextView) { 

     var pos = textView.endOfDocument 
     var currentRect = textView.caretRectForPosition(pos) 
     if(currentRect.origin.y > previousRect?.origin.y){ 
      //new line reached, write your code 
     } 
     previousRect = currentRect 

    } 

Per l'obiettivo C

CGRect previousRect = CGRectZero; 
- (void)textViewDidChange:(UITextView *)textView{ 

    UITextPosition* pos = textView.endOfDocument; 
    CGRect currentRect = [textView caretRectForPosition:pos]; 

    if (currentRect.origin.y > previousRect.origin.y){ 
      //new line reached, write your code 
     } 
    previousRect = currentRect; 

} 
+0

funziona perfettamente per lo scorrimento rapido ma lo scorrimento deve essere abilitato sul testo –

Problemi correlati