2010-09-07 1 views
6

usando il codice seguente, ho messo il testo da un plist in un textView. Il textView non è ancora firstresponder; il testo è inizialmente solo per la lettura. In iOS4 il codice goToEndOfNote posiziona il cursore alla fine del testo AND scorre in quella posizione. In 3.1.3 non scorre fino alla fine finché non viene toccato lo schermo (che non è richiesto a meno che non sia richiesta una modifica o un'aggiunta), rendendo l'analizzatore di messaggi testuale. Mi piacerebbe che funzionasse in 3.1.3 come fa in 4.0. Qualche idea per favore. Grazie.Posizionare il cursore alla fine del testo in UITextView e scorrere fino a posizionare

... 
    self.temp = [[[NSMutableArray alloc] initWithContentsOfFile:myPlistPath] autorelease]; 
    self.textView.text = [self.temp objectAtIndex:0]; 
    [self goToEndOfNote]; 
    //[self performSelector:@selector(goToEndOfNote) withObject:nil afterDelay:0.1]; 
} 

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
} 

risposta

3

Io uso setContentOffset:animated per scorrere fino alla cima di una UITextView in una delle mie applicazioni. Dovrebbe funzionare anche per lo scorrimento verso il basso. Prova:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 

Si potrebbe anche concludere che fino così accade solo per 3.1.3 e sotto:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; 
    float version = [systemVersion floatValue]; 
    if (version < 3.2) { 
     [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
    } 
} 
+0

Quasi ma non del tutto. La vista testuale è la maggior parte dello schermo. In 4.0 la linea add'l [textView setContentOffset: CGPointMake (0, lunghezza) animata: YES]; fa in modo che l'ultimo carattere scorra fino alla fine di textView (buono). In 3.1.3, che provoca l'ultimo carattere per scorrere fino circa a metà strada sullo schermo (ok), ma in entrambe le versioni del sistema operativo, se ci sono solo 1 o 2 linee sullo schermo, vengono fatti scorrere fuori dallo schermo (non così bene). Preferirei lo scorrimento per iniziare solo dopo la presenza di una schermata (come in 4.0 con solo 2 linee originali nel mio metodo). –

2

Non sono sicuro se questa è la risposta, ma funziona.

In 3.1.3, con il codice originale, il cursore si trovava alla fine ma lo scorrimento era in alto. Nella 4.0, entrambi erano in fondo.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(length, 0); 

Ho poi notato che in 3.1.3, la commutazione 0 e la lunghezza, il rotolo era in fondo ma il cursore era in cima.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 

Mettere insieme i due ha funzionato. Essa scorre verso il basso NSMakeRange (0, la lunghezza), presumibilmente alla fine del campo, allora la NSMakeRange (lunghezza, 0) mette il cursore lì, tutti con nessun cambiamento per quello che fa in 4,0

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 
self.textView.selectedRange = NSMakeRange(length, 0); 
1

È possibile utilizzare [UITextView -setSelectedRange:] per impostare un intervallo (location = TEXT_VIEW_STRING_LENGTH, lunghezza = 0) per portare il cursore alla fine del testo, quindi chiamare [UITextView -scrollRangeToVisible:] con lo stesso intervallo per far scorrere il cursore su visibile.

1

È tardi, ma ho trovato la soluzione di lavoro per questo. ha bisogno di un piccolo trucco

- (void) textViewDidBeginEditing:(UITextView*)textview 
{ 
    [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01]; 
} 

- (void)placeCursorAtEnd:(UITextView *)textview 
{ 
    NSUInteger length = textview.text.length; 

    textview.selectedRange = NSMakeRange(length, 0); 

    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 
+0

Molto più pulito quando si utilizza 'dispatch_after()' perché salva un metodo e mantiene il trigger e l'azione insieme. –