2009-08-27 6 views
10

Je voudrais faire un certain type d'actualisation d'UITextView pour remettre le texte à son état d'origine. J'ai un paragraphe qui est dynamiquement rempli en fonction de quel TableViewCell l'utilisateur clique dessus. Donc, quand ils font défiler le champ de texte, puis revenir en arrière et sélectionner une autre cellule et revenir, le texte change, mais la position de défilement reste tel que l'utilisateur l'a quitté. Comment puis-je le ramener à son état par défaut. Merci!Rafraîchir la position de défilement de UITextView sur l'iPhone

+0

Comme note, j'ai essayé d'utiliser [myTextView scrollRangeToVisible: NSMakeRange ([longueur myTextView.text], 0)]; –

Répondre

27

Par défaut, voulez-vous dire défiler vers le haut? Si oui, vous êtes sur la bonne voie. Essayez

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

J'ai essayé ça aussi, mais ça n'a pas l'air d'aller au bout du texte. Il est seulement proche du sommet, mais ne ressemble pas à la valeur par défaut. Honnêtement, je n'ai pas vraiment une bonne compréhension des choses NSRange. –

+0

Je viens d'essayer avec une application que j'ai, et cela fonctionne pour moi. Pouvez-vous poster une capture d'écran de votre simulateur afin que nous puissions voir le comportement? –

+0

Voici quelques captures d'écran: INITIAL, SCROLLED DOWN MANUALLY, & RELOADED http://www.angelfilm.net/external/stackoverflow/mos/ –

8

J'ai trouvé que si j'effacer le UITextView d'abord, puis appliquer le nouveau texte, il sera automatiquement « défiler » Retour vers le haut.

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

Aucune de ces approches n'a fonctionné de manière satisfaisante pour moi.

  • scrollRangeToVisible produit des tonnes d'artefacts visuels (beaucoup de défilement lors de la commutation entre les grandes chaînes), et en fait ne fonctionne que du tout dans un appel retardé quelque temps (je 0,1 seconde) après que le contenu a été modifié, pas directement comme la réponse de Shaggy Frog implique.

  • en réglant le texte sur @ "" avant de définir le nouveau contenu n'a pas aidé, même avec un retard.

Il semble que une fois UITextView a été tapé, il est toujours dans ce mode où la mise en nouveaux contenus provoque des artefacts de défilement ennuyeux. J'ai aussi essayé de définir le paramètre selectionRange au début de UITextView, mais cela n'a pas aidé. Envoyer le message resignFirstResponder avant de définir le nouveau contenu n'a pas aidé non plus. Pour cette raison, j'ai décidé de supprimer et de recréer UITextView chaque fois que je change le contenu. C'est un événement assez rare (basé sur l'interaction humaine) dans mon application que ce n'est pas un problème de performance. C'était la seule façon que je pouvais trouver pour "charger du nouveau contenu" dans l'UITextView sans tonnes d'artefacts de défilement agaçants.

Mon expérience est avec OS3.2 (simulateur ipad)

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

Je voulais réellement arrêter le textView de défilement tout en mettant à jour le contenu , donc je l'ai fait dans l'autre sens et ça fonctionne parfaitement. Je vous remercie. – soemarko

1

J'ai réussi à obtenir le résultat souhaité - forcer la UITextView à « défilement » en haut de son contenu lors de l'édition se termine. Mais pour y parvenir, je devais à la fois désactiver le défilement dans textViewDidEndEditing et également réinitialiser le texte dans la même méthode.

Je réactiver le défilement dans textViewDidBeginEditing.

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

Cela fonctionne si vous le souhaitez pour faire défiler jusqu'au sommet:

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

Le seul problème est que ce anime son chemin. Si vous le souhaitez accrocher au dessus, utilisez ceci:

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

Cette solution a fonctionné pour moi. J'ai chargé le texte dans viewDidLoad, changé le ContentInset de UITextView et ai dû utiliser le scrollRectToVisible pour aligner correctement le haut. Merci – TMilligan

0

Ce qui a finalement fonctionné pour moi quoi effacer le contenu du texte et puis définissez avec le texte de votre choix sur la prochaine boucle de course.

// 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 
}