Arrêter UITextView de saut d'obstacles lors de la mise en texte par programmation
- Je mettre à jour une petite quantité de texte dans un défilement UITextView. Je vais seulement l'insertion d'un caractère où le curseur est actuellement, et je vais faire cela sur une simple pression de bouton sur ma barre de navigation.
Mon problème est que lorsque j'appelle la méthode setText de l'affichage de texte, il saute à bas du texte. J'ai essayé d'utiliser contentOffset et la réinitialisation de la selectedRange mais il ne fonctionne pas! Voici mon exemple:
//Remember offset and selection
CGPoint contentOffset = [entryTextView contentOffset];
NSRange selectedRange = [entryTextView selectedRange];
//Update text
entryTextView.text = entryTextView.text;
//Try and reset offset and selection
[entryTextView setContentOffset:contentOffset animated:NO];
[entryTextView setSelectedRange: selectedRange];
Est-il de toute façon vous pouvez mettre à jour le texte, sans aucun mouvement de défilement du tout... comme si on avait tapé juste quelque chose sur le clavier?
Edit:
J'ai essayé d'utiliser le textViewDidChange: délégué méthode, mais c'est pas encore fait défiler jusqu'à l'emplacement d'origine.
- (void)textViewDidChange:(UITextView *)textView {
if (self.programChanged) {
[textView setSelectedRange:self.selectedRange];
[textView setContentOffset:self.contentOffset animated:NO];
self.programChanged = NO;
}
}
- (void)changeButtonPressed:(id)sender {
//Remember position
self.programChanged = YES;
self.contentOffset = [entryTextView contentOffset];
self.selectedRange = [entryTextView selectedRange];
//Update text
entryTextView.text = entryTextView.text;
}
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez un iPhone 3.0 ou ultérieur, vous pouvez résoudre ce problème:
Il devrait fonctionner maintenant (pas plus de saut)
Ce qui concerne
Meir Assayag
Bâtiment sur Meir suggestion, voici le code qui supprime la sélection par programmation (oui je sais il y a un menu de sélection de la touche qui fait trop, mais je suis en train de faire quelque chose d'un peu funky) sans faire défiler l'affichage de texte.
Cette décision fonctionne pour iOS 8:
Il est nécessaire d'appeler exactement
setContentOffset:animated:
parce que c'est la seule façon d'annuler l'animation.textView.contentOffset = offset
ne sera pas annuler l'animation et ne va pas aider.Les deux solutions ne fonctionnent pas pour moi sur iOS 8.0.
et
- Je configurer un délégué à la textview pour contrôler le défilement de l'événement, et a noté que d'après mon opération pour restaurer le décalage, le décalage est remise à 0 de nouveau. J'ai donc au lieu d'utiliser l'opération principale de la file d'attente pour s'assurer que mon opération de restauration qui se passe après la "remise à 0" option.
Voici ma solution qui fonctionne pour iOS 8.0.
Aucune des solutions proposées a fonctionné pour moi. -setContentOffset:animation: est déclenchée par setText: 3 fois avec de l'animé OUI et un contentOffset de la fin (moins la valeur par défaut 8pt marge d'un UITextView). J'ai enveloppé le -setText: dans un garde:
Dans un UITextView sous-classe en setContentOffset:animation: mettre
entre autres de la logique. N'oubliez pas la super appel. Les travaux de cette.
Raphaël
Afin de modifier le texte d'un UITextView, vous devez mettre à jour c'est textStorage champ:
Bonne chance
dans iOS 7. Il coutures pour être un bug avec sizeThatFits et d'avoir des retours à la ligne (dans votre UITextView la solution que j'ai trouvé qui fonctionne est l'envelopper par la désactivation de défilement. Comme ceci:
et bizarre de saut a été corrigé.
textView.scrollEnabled = NO
danstextDidChange:
semble pour désactiver le défilement à jamais. Cependant sur cet OS, il semble être suffisant de simplement basculerscrollEnabled
une fois au cours deviewDidLoad
, c'est à dire le paramètreNO
et directement en arrière deYES
Prendre un coup d'oeil à la UITextViewDelegate, je crois que le textViewDidChangeSelection méthode peut vous permettre de faire ce que vous avez besoin.
Une vieille question, mais j'ai eu le même problème avec iOS 7 app. Nécessite une modification de la contentOffset un peu après l'exécution de la boucle. Voici une idée rapide.
J'ai frappé un semblable, si ce n'est le même, problème dans IOS9. Modifier les caractéristiques de certains de texte, par exemple, GRAS causé la vue pour faire défiler la sélection de la vue. J'ai trié en ajoutant un appel à scrollRangeToVisible après la setSelectedRange:
Enfin essayer ce, vérifié sur iOS 10
Pas tellement de solution élégante, mais il fonctionne alors qui s'en soucie:
J'ai trouvé une solution qui fonctionne de manière fiable dans iOS 6 et 7 (et probablement les versions antérieures). Dans une sous-classe de UITextView, procédez de la manière suivante:
Aucune des autres réponses de travail dans iOS 7, car il va ajuster les décalages de défilement au moment de l'affichage.