2010-11-23 13 views
2

J'ai un UITextView éditable avec quelques pages de texte. Lorsque l'utilisateur tape à l'intérieur et qu'il fait apparaître le clavier, il cache la partie inférieure du texte et vous ne pouvez pas faire défiler pour le voir.Comment faire en sorte qu'un UITextView défile tout en bas lorsque le clavier est visible

Existe-t-il une façon évidente/facile/standard de gérer cela? Je suppose que c'est un problème commun. Je suppose que vous devez redimensionner la vue de texte quand le clavier est en haut, ou quelque chose comme ça?

De même, lorsqu'ils tapent sur la vue de texte dans la moitié inférieure de la page, comment la faire défiler automatiquement de sorte que la ligne sur laquelle ils ont tapé soit visible lorsque le clavier apparaît? Ou cela sera-t-il automatiquement pris en compte si je redimensionne la vue de texte lorsque le clavier apparaît.

Merci un gars du lot

Répondre

3

Cela a été discuté longuement ici: How to make a UITextField move up when keyboard is present?

J'ai personnellement utilisé la solution de Shiun dans le passé et il fonctionne bien.

MISE À JOUR: Si vous ne souhaitez pas utiliser cette méthode, une méthode légèrement plus simple est de redimensionner votre champ de texte lorsque l'écran du clavier. Il serait préférable de suivre les instructions sur le lien que j'ai posté ci-dessus car la notification KeyboardWillShow vous donnera accès à la hauteur du clavier.

Définissez d'abord le délégué de UITextField = self. Puis:

-(void)textFieldDidBeginEditing:(UITextField *)textField { // This is where the keyboard becomes visible 
    textField.frame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, textField.frame.size.width, textField.frame.size.height-100); 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField { // This is where the keyboard hides itself 
    textField.frame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, textField.frame.size.width, textField.frame.size.height+100); 
} 

Vous pouvez modifier le 100 en fonction de votre orientation, etc. Si vous voulez ajouter des animations que vous pourriez faire:

-(void)textFieldDidBeginEditing:(UITextField *)textField { // This is where the keyboard becomes visible 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     textField.frame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, textField.frame.size.width, textField.frame.size.height-100); 
     [UIView commitAnimations]; 
    } 

    -(void)textFieldDidEndEditing:(UITextField *)textField { // This is where the keyboard hides itself 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     textField.frame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, textField.frame.size.width, textField.frame.size.height+100); 
     [UIView commitAnimations]; 
    } 
+0

J'ai eu une lecture de cette page avant, et n'était pas sûr si elle appliquait , comme il avait une vue de défilement avec un tas de champs de texte. J'ai seulement un UITextView comme vue principale dans ma plume. De plus, ces solutions semblaient trop complexes, y a-t-il un réglage simple qui nous manque ici? – Chris

+0

Dans votre cas, pour vous assurer qu'il reste visible, vous devrez redimensionner votre champ de texte lorsque le clavier affiche et redimensionner à nouveau lorsqu'il se cache. Voir le code dans ma mise à jour et voir si cela vous aide. – faroligo

+1

@Chris: Un UITextView est un scrollview, donc les mêmes techniques s'appliquent. Il n'y a pas de simple "magie faire ce que je veux dire" pour vous. – hotpaw2

1

Cela défilera bien votre UITextView vers le haut du clavier lorsque l'édition commence. Cela fonctionnera également si votre UITextView a une hauteur dynamique (autogrow/autosize lors de la frappe). Testé dans iOS 7.

Appelez votre méthode d'observation du clavier et délégué UITextView à la classe actuelle:

- (void)viewDidLoad 
{ 
    ... 
    [self observeKeyboard]; 
    textView.delegate = (id)self; 
} 

Ajouter observateur du clavier pour UIKeyboardDidShowNotification et UIKeyboardWillShowNotification:

- (void)observeKeyboard 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 
} 

Obtenir la taille du clavier:

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    _keyboardHeight = keyboardSize.height; 
} 

- (void)keyboardDidShow:(NSNotification *)notification 
{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    _keyboardHeight = keyboardSize.height; 
} 

Lorsque UITextView a démarré l'édition n ou la valeur a changé appel scrollKeyboardToTextView:

- (void)textViewDidBeginEditing:(UITextView *)textView 
{ 
    [self scrollKeyboardToTextView:textView]; 
} 

- (void)textViewDidChange:(UITextView *)textView 
{ 
    [self scrollKeyboardToTextView:textView]; 
} 

Faire défiler UITextView avec animation à la partie supérieure du clavier:

- (void)scrollKeyboardToTextView:(UITextView *)textView 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, _keyboardHeight, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 

    CGRect aRect = self.view.frame; 
    aRect.size.height -= _keyboardHeight; 
    CGPoint origin = textView.frame.origin; 
    origin.y -= self.scrollView.contentOffset.y; 
    origin.y += textView.frame.size.height; 

    CGPoint scrollPoint = CGPointMake(0.0, textView.frame.origin.y + textView.frame.size.height - (aRect.size.height)); 
    [self.scrollView setContentOffset:scrollPoint animated:YES]; 
}