2009-08-27 19 views
10

Mi piacerebbe fare un qualche tipo di aggiornamento di un UITextView per riportare il textview allo stato originale. Ho un paragrafo che viene popolato dinamicamente a seconda di quale TableViewCell l'utente fa clic. Quindi quando fanno scorrere il campo di testo, poi tornano indietro e selezionano un'altra cella e ritornano, il testo cambia, ma la posizione di scorrimento rimane mentre l'utente la lascia. Come posso riportarlo allo stato predefinito. Grazie!Aggiorna la posizione di scorrimento di UITextView su iPhone

+0

Come nota, ho cercato di usare [myTextView scrollRangeToVisible: NSMakeRange ([lunghezza myTextView.text], 0)]; –

risposta

27

Per impostazione predefinita, si intende scorrere verso l'alto? Se è così, sei sulla strada giusta. Prova

[myTextView scrollRangeToVisible:NSMakeRange(0, 0)]; 
+1

Ho provato anche quello, ma non sembrava andare nella parte superiore del testo. È solo vicino alla cima, ma non sembra il default. Sinceramente non ho una buona conoscenza della roba NSRange. –

+0

Ho appena provato questo con un'applicazione che ho, e funziona per me. Puoi pubblicare uno screenshot del tuo simulatore in modo che possiamo vedere il comportamento? –

+0

Ecco alcuni screencaps: INIZIALI, RIPRISTINATI MANUALMENTE E RICARICATI http://www.angelfilm.net/external/stackoverflow/mos/ –

8

ho scoperto che se ho chiaro l'UITextView prima e quindi applicare il nuovo testo, che verrà automaticamente "scorrere" back to the top.

myTextView.text = @""; 
myTextView.text = theRealTextContent; 
1

Nessuno di questi approcci ha funzionato in modo soddisfacente per me.

  • scrollRangeToVisible produce tonnellate di artefatti visivi (un sacco di scorrimento quando si passa da stringhe di grandi dimensioni), e infatti funziona solo a tutti in una chiamata ritardata po 'di tempo (io ho usato 0,1 secondi) dopo che il contenuto è stato modificato, non direttamente come implica la risposta di Shaggy Frog.

  • impostare il testo su @ "" prima di impostare il nuovo contenuto non ha aiutato, anche con un ritardo.

Sembra come se una volta UITextView è stato digitato, per sempre è in questa modalità in cui l'inserimento di nuovi contenuti provoca artefatti fastidiosi scorrimento. Ho provato a impostare anche selectRange all'inizio di UITextView, ma ciò non ha aiutato. Anche l'invio del messaggio resignFirstResponder prima di impostare i nuovi contenuti non ha aiutato.

Per questo motivo, ho deciso di eliminare e ricreare UITextView ogni volta che cambio il contenuto. Questo è un evento abbastanza raro (basato sull'interazione umana) nella mia app che non è un problema di prestazioni. Era l'unico modo in cui potevo trovare "caricare nuovi contenuti" in UITextView senza tonnellate di fastidiosi artefatti a scorrimento.

La mia esperienza è con OS3.2 (simulatore di iPad)

5
[textview setScrollEnabled:YES]; 
textview.text = yourText; 
[textview setScrollEnabled:NO]; 
+0

In realtà volevo interrompere lo scorrimento del testo durante l'aggiornamento del contenuto , così l'ho fatto al contrario e funziona perfettamente. Grazie. – soemarko

1

sono riuscito ad ottenere il risultato desiderato - costringendo l'UITextView a 'scorrimento' per la parte superiore del suo contenuto durante la modifica estremità. Ma per realizzarlo ho dovuto BOTH disabilitare lo scrolling in textViewDidEndEditing E ANCHE resettare il testo nello stesso metodo.

Riattivare lo scorrimento in textViewDidBeginEditing.

- (void) textViewDidEndEditing: textView; 
{ 
    [textView setScrollEnabled: NO]; 
    NSString* savedText = [textView text]; 
    [textView setText:@""]; 
    [textView setText: savedText]; 
} 
6

Questo funziona se si vuole scorrere fino alla cima:

[theTextView scrollRangeToVisible:NSMakeRange(0, 0)]; 

L'unico problema è che questa anima la sua strada fino. Se si desidera scattare verso l'alto, utilizzare questo:

[theTextView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
+0

Questa soluzione ha funzionato per me. Ho caricato il testo in viewDidLoad, modificato ContentInset di UITextView e poi ho dovuto usare scrollRectToVisible per far sì che la parte superiore si allinei correttamente. Grazie – TMilligan

0

Ciò che alla fine ha funzionato per me quello che per cancellare il contenuto del testo e quindi impostare con il testo desiderato sul prossimo ciclo di esecuzione.

// clear the text view 
self.textView.text = "" 

// set the text on the next run loop 
dispatch_async(dispatch_get_main_queue()) { 
    self.textView.text = someText 
} 
Problemi correlati