67 votes

Désactiver UIScrollView défilement lorsque UITextField devient le premier répondeur

Lorsqu'un objet UITextField, incorporé dans un UIScrollView devient le premier intervenant, de par permet de dire à l'utilisateur de taper quelques caractères, la UIScrollView défile à ce Champ automatiquement, est-il un moyen de le désactiver?

Double rdar://16538222 plus https://bugreport.apple.com

64voto

Luke Points 7120

Bâtiment sur Moshe la réponse...

Sous-classe UIScrollView et de redéfinir la méthode suivante:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

Laissez-le vide. Travail de fait!

59voto

Taketo Sano Points 414

J'ai été aux prises avec le même problème, et j'ai trouvé une solution.

J'ai étudié la façon dont la fonction de défilement automatique est fait par le suivi de l'appel à la trace, et de constater qu'un interne [UIFieldEditor scrollSelectionToVisible] est appelé lorsqu'une lettre est tapée dans l'objet UITextField. Cette méthode semble agir sur le UIScrollView de l'ancêtre le plus proche de l'objet UITextField.

Donc, sur textFieldDidBeginEditing, en enveloppant l'objet UITextField avec un nouveau UIScrollView avec la même taille de celui-ci (qui est, de l'insertion de la vue entre l'objet UITextField et c'est superview), cela va bloquer le défilement automatique. Enfin supprimer ce wrapper sur textFieldDidEndEditing.

Le code va comme:

- (void)textFieldDidBeginEditing:(UITextField*)textField {  
    UIScrollView *wrap = [[[UIScrollView alloc] initWithFrame:textField.frame] autorelease];  
    [textField.superview addSubview:wrap];  
    [textField setFrame:CGRectMake(0, 0, textField.frame.size.width, textField.frame.size.height)]; 
    [wrap addSubview: textField];  
}  

- (void)textFieldDidEndEditing:(UITextField*)textField {  
  UIScrollView *wrap = (UIScrollView *)textField.superview;  
  [textField setFrame:CGRectMake(wrap.frame.origin.x, wrap.frame.origin.y, wrap.frame.size.width, textField.frame.size.height)];
  [wrap.superview addSubview:textField];  
  [wrap removeFromSuperview];  
}  

espérons que cette aide!

8voto

danbretl Points 194

Comme Taketo dit, quand un UITextField est faite de premier intervenant, de son premier parent de la vue est de type UIScrollView (si il existe) défile à faire que UITextField visible. La méthode la plus simple hack est tout simplement envelopper chaque objet UITextField dans un UIScrollView (ou, idéalement, enveloppez-les tous dans un seul mannequin UIScrollView). Ceci est très similaire à Taketo de la solution, mais il devrait vous donner une performance légèrement meilleure, et elle permet de conserver votre code (ou de votre interface dans Interface Builder) beaucoup plus propre à mon avis.

0voto

Kjuly Points 15089

J'ai essayé @TaketoSano réponse, mais ne semble pas fonctionne ... Mon cas est que je n'ai pas une scrollview, juste un point de vue avec plusieurs champs de texte.

Et enfin, j'ai obtenu une solution de contournement. Il s'agit de deux de notification par défaut les noms de clavier que j'ai besoin de:

  • UIKeyboardDidShowNotification lorsque le clavier n'spectacle;
  • UIKeyboardWillHideNotification lorsque le clavier s'en cacher.

Voici l'exemple de code que j'ai utilisé:

- (void)viewDidLoad {
  [super viewDidLoad];

  ...

  NSNotificationCenter * notificationCetner = [NSNotificationCenter defaultCenter];
  [notificationCetner addObserver:self
                         selector:@selector(_keyboardWasShown:)
                             name:UIKeyboardDidShowNotification
                           object:nil];
  [notificationCetner addObserver:self
                         selector:@selector(_keyboardWillHide:)
                             name:UIKeyboardWillHideNotification
                           object:nil];
}

- (void)_keyboardWasShown:(NSNotification *)note {
  [self.view setFrame:(CGRect){{272.f, 55.f}, {480.f, 315.f}}];
}

- (void)_keyboardWillHide:(NSNotification *)note {
  [self.view setFrame:(CGRect){{272.f, 226.5f}, {480.f, 315.f}}];
}

Ici, l' (CGRect){{272.f, 226.5f}, {480.f, 315.f}} est la vue par défaut de l'image lorsque le clavier est caché. Et (CGRect){{272.f, 55.f}, {480.f, 315.f}} est la vue de l'image lorsque le clavier n'spectacle.

Et b.t.w., le point de vue de l'image modification sera appliquée animation automatiquement, c'est vraiment parfait!

0voto

Moshe Points 23825

Je ne sais pas du tout bien de UIScrollView que cela. Il serait mauvaise expérience à l'utilisateur d'être en mesure de désactiver ce, à mon humble avis.

Cela dit, il peut être possible de la sous-classe UIScrollView et remplacer certains de ses méthodes pour vérifier que l'objet UITextfield n'est pas intervenant de première ligne avant de vous déplacer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X