sale - ios 12 novedades
iOS Teclado muestra el manejo de eventos (2)
Estoy trabajando en una aplicación de chat en la que tengo una vista de texto (no de texto) y cuando hago clic en él, el teclado debe mostrar y todo debe moverse hacia arriba.
Hasta ahora, he logrado cambiar el marco de la vista de tabla y la vista de texto hacia arriba y mostrar el teclado usando el siguiente código.
- (void)keyboardWasShown:(NSNotification *)notification {
NSDictionary* info = [notification userInfo];
keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGPoint contentViewOrigin = self.contentView.frame.origin;
CGFloat contentViewHeight = self.contentView.frame.size.height;
CGRect visibleRect = self.view.frame;
visibleRect.size.height -= keyboardSize.height;
BOOL up = CGRectContainsPoint(visibleRect, contentViewOrigin);
if (!up){
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,self.tableView.frame.origin.y,self.tableView.frame.size.width,280.0f);
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, 0 - keyboardSize.height);
if([self.tableView numberOfRowsInSection:0]!=0)
{
NSIndexPath* ip = [NSIndexPath indexPathForRow:[self.tableView numberOfRowsInSection:0]-1 inSection:0];
[self.tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:UITableViewRowAnimationLeft];
}
}
}
- (void)keyboardWillBeHidden:(NSNotification *)notification {
self.contentView.frame = originalContentView;
self.tableView.frame = originalTable;
}
- (void)registerForKeyboardNotifications {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)deregisterFromKeyboardNotifications {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidHideNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardWillHideNotification
object:nil];
}
Pero cuando vi cómo lo hace, el mío parecía un truco. El teclado de Whatsapp se mueve junto con todos los elementos mientras que el mío funciona así: Primero se muestra el teclado, se envía una notificación a la aplicación, se recibe una notificación, el código calcula la altura del teclado y sube los elementos según la altura.
He buscado y encontrado la solución que he implementado.
¿Alguien puede ayudar?
- Puede usar UIKeyboardWillShowNotification y UIKeyboardWillHideNotification
- Pruebe TPKeyboardAvoidingScrollView desde aquí: https://github.com/michaeltyson/TPKeyboardAvoiding (mi elección)
Uso mucho este truco en mis aplicaciones. Desea escuchar UIKeyboardWillShowNotification
y UIKeyboardWillHideNotification
. La mejor manera de manejar la animación, en mi opinión, es usar el autolayout. Cuando llama a [self.view layout IfNeeded]; sus puntos de vista se moverán junto con la animación del teclado. No se necesita bloque de animación.
¡He creado un proyecto simple para que cualquiera intente y vea cómo funciona!
- (void)addKeyboardNotificationsObserver {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)handleKeyboardWillShow:(NSNotification *)paramNotification
{
NSDictionary* info = [paramNotification userInfo];
//when switching languages keyboard might change its height (emoji keyboard is higher than most keyboards).
//You can get both sizes of the previous keyboard and the new one from info dictionary.
// size of the keyb that is about to disappear
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// size of the keyb that is about to appear
CGSize kbSizeNew = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
//make adjustments to constraints here...
//and here where''s magick happen!
[self.view layoutIfNeeded];
}
- (void)handleKeyboardWillHide:(NSNotification *)paramNotification
{
//adjust constraints
[self.view layoutIfNeeded];
}