UIWebView desplazándose hacia abajo en el foco de input iOS 6 solamente

Estoy cargando un UIWebView en un modal. La página web tiene algunas inputs que funcionan exactamente como se pretendía en iOS 5. Sin embargo, en iOS 6, cada vez que una input recibe un enfoque, el keyboard está haciendo su 'centrado' automático de la forma, aunque las inputs tienen mucho espacio para mostrarse arriba el keyboard. Dado que algunas de las inputs están en la parte superior de la página, esto las obliga a no verlas, por lo que el usuario no puede ver lo que están escribiendo. Al desplazarse hacia atrás para ver las inputs, el keyboard deja de funcionar hasta que se descarta y vuelve a enfocar la input (a su vez, la vuelve a desplazar fuera de la vista). ¿Es este un comportamiento esperado en iOS 6? ¿Hay alguna forma de evitar que la vista web se desplace cuando una input se concentra (como funciona iOS 5)?

Sin conocer el funcionamiento interno de su código, trataré de ayudar tanto como pueda. Si nada más, espero brindar algo de reflexión. Hiciste dos preguntas:

¿Se espera el comportamiento en iOS6?

Lo que estás viendo es bastante extraño. Es extraño que webView esté centrando la forma en lugar de centrar el campo de input. Y definitivamente no debería hacer que el campo de input activo se desplace fuera de la vista. Además, el keyboard parece dejar de funcionar, lo cual es bastante extraño. Sin embargo, se espera que vea diferentes comportamientos en iOS 5 y 6 con respecto al desplazamiento de WebView. Como dijiste, iOS 5 desplaza el inputField a la vista mientras que iOS6 lo pone en el centro.

¿Hay alguna forma de evitar que la vista web se desplace cuando una input se concentra (como funciona iOS 5)?

Sí. Proporciono código para hacer exactamente esto a continuación, es decir, para evitar que el webView se desplace. Si eso es exactamente lo que quieres hacer, entonces genial. Sin embargo, detener el webView del desplazamiento no es lo mismo que get el mismo comportamiento que iOS5. Sin embargo, quería darte esta opción tal como la solicitaste.

#import "ViewController.h" @interface ViewController () <UIScrollViewDelegate> { CGPoint origin; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [self.webView loadRequest:request]; self.webView.scrollView.delegate = self; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; // NOTE THAT SIMPLY DISABLING THE SCROLL WILL NOT PREVENT KEYBOARD SCROLL //[self.webView.scrollView setScrollEnabled:NO]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)keyboardWillShow { NSLog(@"keyboard"); origin = self.webView.scrollView.contentOffset; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"scroll"); [self.webView.scrollView setContentOffset:origin]; } @end 

Si quieres un comportamiento de desplazamiento consistente …

Me tomé un time para codificar esta modificación de desplazamiento. Puede utilizarlo como reference para hacer su propio comportamiento de desplazamiento consistente en iOS 5 y 6. En este código: cuando el usuario hace clic en un cuadro de input de text en una página web, el código detendrá el comportamiento de desplazamiento pnetworkingeterminado manteniendo la página desplazada a su position actual. Desafortunadamente, no hay forma de cancelar todo el desplazamiento, sino que debes anular los desplazamientos. Una vez que el desplazamiento pnetworkingeterminado se ha "suprimido", obtiene la position del cuadro de input activo y se desplaza a esa position. Esto pondrá el cuadro de input activo en la parte superior de la pantalla. Puedes modificar esto de acuerdo a tus preferences. Por ejemplo, puede usar [UIScrollView scrollRectToVisible] para hacerlo más parecido a iOS5.

 #import "ViewController.h" @interface ViewController () <UIScrollViewDelegate> { CGPoint origin; CGPoint activeElementOrigin; BOOL pauseScroll; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [self.webView loadRequest:request]; self.webView.scrollView.delegate = self; pauseScroll = NO; origin = CGPointZero; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil]; } - (void)keyboardWillShow { NSLog(@"keyboard"); pauseScroll = YES; origin = self.webView.scrollView.contentOffset; } - (void)keyboardDidShow { NSLog(@"keyboard DID SHOW"); pauseScroll = NO; [self.webView.scrollView setContentOffset:activeElementOrigin animated:YES]; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"scroll"); if (pauseScroll) { [self.webView.scrollView setContentOffset:origin animated:NO]; NSString *javaScript = [NSString stringWithFormat:@"function f(){ var textField = document.activeElement; return textField.getBoundingClientRect().top; } f();"]; NSString *textFieldRectTop = [self.webView stringByEvaluatingJavaScriptFromString:javaScript]; activeElementOrigin = origin; activeElementOrigin.y = [textFieldRectTop floatValue]-10; } } @end 

Si este código te ayudó, sería muy amable de tu parte recompensarme con la recompensa. Sería humildemente agradecido.

Una solución podría estar deshabilitando el desplazamiento en este UIWebView:

 UIScrollView *scrollView = webView.scrollView; [scrollview setScrollEnabled:NO]; [scrollView bounces:NO]; 

Otra podría estar configurando UIEdgeInsets de este scrollView, pero no sé mucho sobre esto.

Creo que este es un comportamiento estándar en iOS 5 y 6 para desplazarse para hacer que el campo de input esté justo encima del keyboard (como lo hace Safari).

La respuesta marcada en esta publicación tiene su respuesta: ¿Cómo hacer que un UITextField se mueva cuando el keyboard está presente?

En resumen, necesita upload la vista que contiene las inputs que se están sacando de la vista. La publicación también contiene un código de muestra sobre cómo hacerlo.

Espero que esto ayude.