2012-07-02 19 views
7

Quiero agregar un accesorioView en un teclado llamado desde un UISearchBar. Como UISearchBar no implementa esta propiedad, acabo de crear una barra de herramientas. Después de Apple's documentation al respecto, decidí usar el centro de notificaciones no solo para saber cuándo se llama el teclado sino también para conocer el tamaño del teclado, que cambia según la orientación.tamaño del teclado dado por NSNotificationCenter

He seguido el ejemplo en la documentación y, en el método keyboardWasShown, llamo a una animación que mostrará la barra de herramientas en la parte superior del teclado. Algo como esto:

-(void)keyboardWasShown:(NSNotification*)aNotification { 

    NSDictionary *info=[aNotification userInfo]; 
    CGSize keyboardSize=[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    NSLog(@"width: %.1f; heigth: %.1f", keyboardSize.width, keyboardSize.height); 

    [self showAccessoryView:keyboardSize.height]; 


} 

y, en la animación que establece el marco de la barra de herramientas de la siguiente manera:

self.auxiliaryKeyboardBar.frame=CGRectMake(0, self.view.frame.size.height-(44+kbh), self.view.frame.size.width, 44); 

, donde 44 es la heigth estática de la barra de herramientas y la kbh es la keyboard.size .heigth pasó del método de arriba.

El problema que estoy observando es que el tamaño del teclado proporcionado por el diccionario userInfo siempre se refiere a la orientación vertical. Por lo tanto, la NSLog en orientación vertical es:

width: 320.0; heigth: 216.0, que está bien

pero cuando cambio la orientación a horizontal y que llamo el teclado, el NSLog es el siguiente:

width: 162.0; heigth: 480.0, lo que pone la barra de herramientas fuera de alcance.

modo, terminé la adición de un condicional antes de llamar a la animación, como este:

if ([self deviceIsPortrait]==YES) { 
     [self showAccessoryView:keyboardSize.height]; 
    }else if ([self deviceIsPortrait]==NO) { 
     [self showAccessoryView:keyboardSize.width]; 
    } 

Ahora estoy preguntando si estoy o no estoy haciendo algo mal, porque yo estoy siguiendo ejemplo de Apple precisamente para evitar la dependencia de la altura del teclado (como un flotador) y terminé teniendo que agregar una orientación condicional de todos modos.

¿Alguna idea de lo que está pasando aquí?

Respuesta

25

creo que lo que se pierde es la siguiente:

CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window]; 

que es un poco fuera de contexto, por lo que aquí es la aplicación plena:

- (void) keyboardDidShow:(NSNotification*)notification { 
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    NSLog(@"keyboard frame raw %@", NSStringFromCGRect(keyboardFrame)); 

    UIWindow *window = [[[UIApplication sharedApplication] windows]objectAtIndex:0]; 
    UIView *mainSubviewOfWindow = window.rootViewController.view; 
    CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window]; 
    NSLog(@"keyboard frame converted %@", NSStringFromCGRect(keyboardFrameConverted)); 
} 
+0

El CGRect almacenado en la clave UIKeyboardFrameBeginUserInfoKey es en el sistema de coordenadas de la ventana (que siempre está en la orientación no girada) –

+0

Gracias a ambos por la respuesta y la aclaración. Todos juntos son un poco dolorosos. – Marcal

+0

Esto parece no funcionar para mí en dispositivos de 64 bits. – korbonix

Cuestiones relacionadas