iphone ios cocoa-touch uiview uikeyboard

iphone - Convertir UIKeyboardFrameEndUserInfoKey para ver o coordinar las ventanas



ios cocoa-touch (3)

Para la constante UIKeyboardFrameEndUserInfoKey , en los documentos de Apple dice:

Estas coordenadas no tienen en cuenta ningún factor de rotación aplicado al contenido de la ventana como resultado de los cambios de orientación de la interfaz. Por lo tanto, es posible que necesite convertir el rectángulo en coordenadas de ventana (usando el método convertRect: fromWindow:) o ver las coordenadas (usando el método convertRect: fromView:) antes de usarlo.

Así que si uso [view1 convertRect:rect fromView:view2]

¿Qué insertaría para los parámetros anteriores para que convierta los valores de rotación correctamente? es decir:

view1 =? rect =? (el marco del teclado que estoy asumiendo) view2 =?

He estado probando algunas cosas y consiguiendo algunas cosas graciosas.


La primera vista debe ser tu vista. La segunda vista debe ser nula, es decir, las coordenadas de la ventana / pantalla. Así:

NSDictionary* d = [notification userInfo]; CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue]; r = [myView convertRect:r fromView:nil];

Ahora tiene el rectángulo que ocupará el teclado, en términos de su vista. Si su vista es la vista del controlador de la vista actual (o una subvista de la misma), ahora se contabiliza la rotación, etc.


Probé la respuesta aceptada y descubrí que en realidad no proporciona el CGRect del teclado dentro de la vista. Descubrí que tengo que convertir el CGRect del objeto UIScreen al objeto UIWindow, y del objeto UIWindow al objeto UIView:

NSValue * keyboardEndFrame; CGRect screenRect; CGRect windowRect; CGRect viewRect; // determine''s keyboard height screenRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; windowRect = [self.view.window convertRect:screenRect fromWindow:nil]; viewRect = [self.view convertRect:windowRect fromView:nil];

Uso lo anterior para cambiar el tamaño de la vista raíz para que no quede oculto por el teclado:

NSTimeInterval duration; CGRect frame; // determine length of animation duration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // resize the view frame = self.view.frame; frame.size.height -= viewRect.size.height; // animate view resize with the keyboard movement [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:duration]; self.view.frame = frame; [UIView commitAnimations];


+ (void)parseKeyboardNotification:(NSNotification *)notification inRelationToView:(UIView *)view info:(void(^)(NSTimeInterval keyboardAnimationDuration, CGRect keyboardFrameInView, UIViewAnimationOptions keyboardAnimationOptions))callback { NSParameterAssert(notification != nil); NSParameterAssert(view != nil); NSDictionary *userInfo = [notification userInfo]; UIViewAnimationCurve animationCurve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; UIViewAnimationOptions animationOption = animationCurve << 16; // https://devforums.apple.com/message/878410#878410 NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // http://.com/a/16615391/202451 CGRect screenRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect windowRect = [view.window convertRect:screenRect fromWindow:nil]; CGRect viewRect = [view convertRect:windowRect fromView:nil]; callback(animationDuration, viewRect, animationOption); }

Puede ser utilizado como este

- (void)keyboardWillShowOrHide:(NSNotification *)notification { [AGKeyboardInfo parseKeyboardNotification:notification inRelationToView:self.view info:^(NSTimeInterval keyboardAnimationDuration, CGRect keyboardFrameInView, UIViewAnimationOptions keyboardAnimationOptions) { [UIView animateWithDuration:keyboardAnimationDuration delay:0 options:keyboardAnimationOptions animations:^{ // do any modifications to your views } completion:nil]; }]; }