¿Cómo cambio el tamaño de las vistas cuando el keyboard aparece con el layout automático?

Tengo una vista (un UITableView en este caso, pero eso no es importante) en mi UIViewController que quiero tener el tamaño cambiado de altura cuando aparece el keyboard.

¿Cuál es la mejor manera de hacer esto en Auto Layout? Actualmente en la vista tengo estas restricciones:

  • Espacio superior a supervisión: 0
  • Espacio final a supervise: 0
  • Líder en espacio para supervisión: 0
  • Espacio inferior a supervisión: 0
  • Altura igual = 424

Creo que la forma más rápida de hacerlo es eliminar la restricción de altura y espacio inferior y simplemente cambiar el tamaño de la vista real en el código cuando se llama a la notificación keyboardDidAppear , pero ¿hay alguna otra manera de hacerlo?

EDIT: eliminé la restricción de altura, mi mala.

Le daría una idea genérica, es posible que necesite ser reajustada para su proyecto real.

Persumo el UITableView *_tableView se ha configurado correctamente en algún lugar antes.

 - (void)viewDidLoad { // ... [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) { id _obj = [note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey]; CGRect _keyboardFrame = CGRectNull; if ([_obj respondsToSelector:@selector(getValue:)]) [_obj getValue:&_keyboardFrame]; [UIView animateWithDuration:0.25f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{ [_tableView setContentInset:UIEdgeInsetsMake(0.f, 0.f, _keyboardFrame.size.height, 0.f)]; } completion:nil]; }]; [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *note) { [UIView animateWithDuration:0.25f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{ [_tableView setContentInset:UIEdgeInsetsZero]; } completion:nil]; }]; // ... 

}

NOTA: si su UITTableView no está en la parte inferior de la pantalla con precisión, el valor del contenido de contenido debe ser refinado en esta línea: [_tableView setContentInset:UIEdgeInsetsMake(0.f, 0.f, _keyboardFrame.size.height, 0.f)];

Mantenga su restricción de altura y conecte una toma de stream:

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *CS_TableView_Height; 

Eche un vistazo al ejemplo 3 de este tutorial .

Actualice la altura de su vista capturando events de keyboard usando NSNotificationCenter :

 - (void)viewWillAppear:(BOOL)animated { // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil]; } - (void)viewWillDisappear:(BOOL)animated { // unregister for keyboard notifications while not visible. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } 

Es posible que también desee echar un vistazo a la respuesta aceptada de esta pregunta para algunas inspiraciones.

Entonces, al final, debes get algo como esto:

 - (void)keyboardWillShow { self.CS_TableView_Height.constant = 500;//For example [self.tableView setNeedsUpdateConstraints]; } - (void)keyboardWillHide { self.CS_TableView_Height.constant = 568;// iPhone5 height [self.tableView setNeedsUpdateConstraints]; } 

En primer lugar, no debe agregar una restricción de arriba y abajo Y una restricción de altura. Si el tamaño de la pantalla cambia, la aplicación se bloqueará (a less que una de las restricciones tenga menor prioridad, en cuyo caso se eliminará).

En segundo lugar, en su método de notificación keyboardDidAppear, simplemente cambia el espacio inferior al valor constante de la supervisión y llama [myView setNeedsDisplay]

Edit: no hace el setNeedsDisplay después de becomeFirstResponder. Agregue usted self como observador de las notifications del keyboardWillHide y el setNeedsDisplay , y con ese método, actualiza la restricción y llama a setNeedsDisplay .

Eche un vistazo a esta publicación de Apple , Listing 5-1 Handling the keyboard notifications y el Listing 5-2 Additional methods for tracking the active text field proporcionan el código.