Evitar UIWebView para reposicionar el campo de input

Tengo una aplicación iPad en la que muestro un formulario de input como UIWebView en un UIPopoverController. Mi controller popover tiene un tamaño tal que no tiene que cambiar el tamaño cuando aparece el keyboard.

Cuando toco en un campo de input en UIWebView, la vista web se empuja hacia arriba cuando aparece el keyboard. Se empuja hasta el punto en que el campo de text está en la parte superior del marco. (Este es el comportamiento estándar que ve cuando usa formularios en safari mobile).

La vista web no se desplaza en absoluto antes de que el keyboard esté hacia arriba, pero una vez que lo está, (como se ve en la segunda image) puedo desplazar la vista web hacia abajo a la position correcta.

Debido a que mi webview ya tiene el tamaño correcto, no quiero este comportamiento. ¿Alguien tiene alguna sugerencia sobre cómo prevenir esto? (No usar una vista web aquí no es una opción)

¡Gracias!

Vista sin tecladoVista con teclado

  1. Agregue UIKeyboardWillShowNotification a NSNotificationCenter en viewDidLoad

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
  2. Implementar keyboardWillShow: y reajustar los methods de WebViewScroller

     - (void)keyboardWillShow:(NSNotification *)aNotification { [self performSelector:@selector(readjustWebviewScroller) withObject:nil afterDelay:0]; } - (void)readjustWebviewScroller { _webView.scrollView.bounds = _webView.bounds; } 

Esto funciona para mí.

No soy progtwigdor de Objective-C (de hecho no conozco Objective-C en absoluto :-), pero necesitaba hacer esto también (en mi aplicación web que se ejecuta en iPad en una WebView), así que con un "poca" ayuda de Google hice esto:

 - (void)init { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)keyboardWillShow:(NSNotification *)aNotification { float x = self.webView.scrollView.bounds.origin.x; float y = self.webView.scrollView.bounds.origin.y; CGPoint originalOffset = CGPointMake(x, y); for (double p = 0.0; p < 0.1; p += 0.001) { [self setContentOffset:originalOffset withDelay:p]; } } - (void)setContentOffset:(CGPoint)originalOffset withDelay:(double)delay { double delayInSeconds = delay; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self.webView.scrollView setContentOffset:originalOffset animated:NO]; }); } 

Sé que esta no es la mejor solución, pero funciona. Desde el punto de vista de una progtwigción general (no sé Objective-C), supongo que es posible sobrescribir el método setContentOffset de la class UIScrollView e implementar su propio comportamiento (y posiblemente llamar a un super método de un padre).