Convierta UIKeyboardFrameEndUserInfoKey en vistas o coorderadas de windows

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

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

Entonces, si uso [view1 convertRect:rect fromView:view2]

¿Qué inserté para los parameters anteriores para lograr que convierta los valores de rotation correctamente? es decir:

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

He estado probando algunas cosas y obteniendo algunas cosas divertidas.

La primera vista debe ser su vista. La segunda vista debe ser nula, lo que significa que las coorderadas de la window / 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 keyboard, en términos de su vista. Si su vista es la vista del controller de vista actual (o una subvista del mismo), la rotation y demás se contabilizan ahora.

Probé la respuesta aceptada y descubrí que en realidad no proporciona la CGRect del keyboard dentro de la vista. Descubrí que tengo que convertir el CGRect del object UIScreen al object UIWindow y del object UIWindow al object 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]; 

Utilizo lo anterior para cambiar el tamaño de la vista raíz para que no se oculte el keyboard:

 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://stackoverflow.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); } 

Se puede usar de esta manera

 - (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]; }]; }