2010-08-27 1 views
23

Sto usando UITextView Nella mia vista, ho bisogno di contare il numero di righe contenute da textview usando la seguente funzione per leggere '\n'. Tuttavia questo funziona solo quando il tasto di ritorno viene premuto dalla tastiera, ma nel caso in cui la riga warapper (quando digito caratteri continui non otterrò il nuovo carattere di linea). Come faccio a leggere il nuovo carattere quando la riga viene modificata senza premere il tasto Invio? Qualcuno ha idea di come anzi .. ti invitiamo a condividere .. sto follwing questo link LinkCome leggere il numero di righe in UITextView

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 
    // Any new character added is passed in as the "text" parameter 
    if ([text isEqualToString:@"\n"]) { 
     // Be sure to test for equality using the "isEqualToString" message 
     [textView resignFirstResponder]; 

     // Return NO so that the final '\n' character doesn't get added 
     return NO; 
    } 
    // For any other character return YES so that the text gets added to the view 
    return YES; 
} 
+3

I due valori di 'BOOL' non sono' TRUE' e 'FALSE'; sono 'SÌ' e' NO'. – BoltClock

risposta

26

Potete guardare la proprietà contentSize del UITextView per ottenere l'altezza del testo in pixel, e dividere per la spaziatura dell'altezza della linea del carattere di UITextView per ottenere il numero di righe di testo nel totale UIScrollView (schermo acceso e spento), inclusi sia il testo spezzato sia il testo interrotto.

+62

numLines = textView.contentSize.height/textView.font.lineHeight; – nacho4d

+1

ho risolto questo con numLines = textView.contentSize.height/textView.font.leading; – santosh

+8

'textView.font.leading' è deprecato in iOS4. Usa 'textView.font.lineHeight'. http://developer.apple.com/library/ios/#documentation/uikit/reference/UIFont_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/UIFont/leading – cnotethegr8

27

In iOS 7, dovrebbe essere esattamente:

float rows = (textView.contentSize.height - textView.textContainerInset.top - textView.textContainerInset.bottom)/textView.font.lineHeight; 
+13

Risposta molto buona ma è errata in alcune dimensioni di carattere a causa del risultato di essere convertito in int. Arrotondalo per evitare errori: 'float rows = round ((textView.contentSize.height - textView.textContainerInset.top - textView.textContainerInset.bottom)/textView.font.lineHeight)' –

+0

@Ricardo Sánchez-Sáez: hai ragione . – Jacky

+0

Non penso che 'round' sia meglio di' floor', perché 'contentSize' è sempre più grande di' textView' per 'text'. @ RicardoSánchez-Sáez –

-5

Solo per riferimento ...

Un altro modo è possibile ottenere il numero di righe e anche il contenuto, è la divisione delle linee in un array usando lo stesso metodo menzionato nella modifica della risposta di BoltClock.

NSArray *rows = [textView.text componentsSeparatedByString:@"\n"]; 

È possibile scorrere la matrice per ottenere il contenuto di ogni riga e si può usare [count righe] i per ottenere il numero esatto di righe.

Una cosa da tenere a mente è che vengono contate anche le linee vuote.

+2

Questo non funziona se il testo si avvolge a causa di un ritorno a capo (cioè il tasto di ritorno non è stato premuto). –