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
risposta
Per impostazione predefinita, si intende scorrere verso l'alto? Se è così, sei sulla strada giusta. Prova
[myTextView scrollRangeToVisible:NSMakeRange(0, 0)];
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. –
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? –
Ecco alcuni screencaps: INIZIALI, RIPRISTINATI MANUALMENTE E RICARICATI http://www.angelfilm.net/external/stackoverflow/mos/ –
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;
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)
[textview setScrollEnabled:YES];
textview.text = yourText;
[textview setScrollEnabled:NO];
In realtà volevo interrompere lo scorrimento del testo durante l'aggiornamento del contenuto , così l'ho fatto al contrario e funziona perfettamente. Grazie. – soemarko
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];
}
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];
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
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
}
Come nota, ho cercato di usare [myTextView scrollRangeToVisible: NSMakeRange ([lunghezza myTextView.text], 0)]; –