2011-12-21 7 views
15

[Editar:] El problema ha sido resuelto. No tenía mis delegados vinculados correctamente en UIBuilder. El código es bueno!Mover UIScrollView cuando el teclado entra en su lugar

Estoy tratando de cambiar el tamaño de una vista de desplazamiento cuando aparece el teclado. Fui a los documentos del desarrollador y encontré esta información.

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW1

A la izquierda "Gestión del teclado".

En la documentación muestra un poco de código para detectar el tamaño del teclado y luego cambiar el tamaño de un UIScrollView. He colocado un mensaje de NSLog en el código para la función - (void)keyboardWasShown:(NSNotification*)aNotification así que no veo que la función es en realidad ser llamado, pero cuando intento a la NSLogkbSize .height siempre tiene un valor de 0.

¿Por qué el código que apple proporcionar para este propósito no funciona?

- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 
+0

Muchas gracias, que fragmento de código contiene todo lo que necesitaba :) – matehat

+2

Se puede usar la biblioteca [KBKeyboardObserver] (https://github.com/kam800/KBKeyboardObserver) para observar los eventos de teclado. – kam800

Respuesta

3

¿Alguna vez ha añadido un observador para esa notificación específica? Asegúrese de que en su método de loadView hacer esto:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; 

No se olvide de anular el registro del observador viewDidUnload método como este:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

Avísame si eso funciona!

+0

Añadí los observadores, como mencioné, puedo ver que se llama a la función cuando se muestra el teclado, así que sé que el observador está funcionando. Gracias, aunque siempre es bueno para verificar dos cosas, – thenetimp

+2

Necesita actualizar esta publicación. viewDidUnload ya no se llama. –

33

Es posible que desee probar el muy recomendable "TPKeyboardAvoidingScrollView", disponible en: https://github.com/michaeltyson/TPKeyboardAvoiding

funciona como un encanto ...

+1

+1 Fácil de implementar y muy bueno. Sugiero combinarlo con el BSKeyboardControl para agregar control de navegación en los campos de texto: http://www.cocoacontrols.com/controls/bskeyboardcontrols – Groot

+0

@Reuven Al usar TPKeyboardAvoidingScrollview, a veces, si copiamos y pegamos en textview, la vista se eleva por completo. ¿hay alguna solución para eso? ... –

+1

¿Funciona con 'UIPresentationModeFormSheet' aunque? – fatuhoku

0

He hecho esto varias veces con un UITableView (que es sólo una extendido UIScrollView). Puede encontrar el code in this answer.

0

Una solución sencilla es añadir la extensión UIViewController + Keyboard.swift a su proyecto, con una sola línea

setupKeyboardNotifcationListenerForScrollView(scrollView) 

que se auto redimensionar automáticamente cuando aparece el teclado. ¡No hay necesidad de subclasificar nada, solo una extensión! Su liviano en GitHub SingleLineKeyboardResize

Cuestiones relacionadas