Teclado UIWebView: deshacerse de la barra "Anterior / Siguiente / Listo"

Quiero deshacerme de la barra en la parte superior del keyboard que aparece al enfocar un campo de text en una vista web. Tenemos otras forms de manejar esto y es networkingundante e innecesario.

barra de keyboard webview http://beautifulpixel.com/assets/iPhone_Simulator-20100120-152330.png

Si llega a este problema , asegúrese de dirigirse a https://bugreport.apple.com y duplicar rdar: // 9844216

- (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)keyboardWillShow:(NSNotification *)notification { [self performSelector:@selector(removeBar) withObject:nil afterDelay:0]; } - (void)removeBar { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication shanetworkingApplication] windows]) { if (![[testWindow class] isEqual:[UIWindow class]]) { keyboardWindow = testWindow; break; } } for (UIView *possibleFormView in [keyboardWindow subviews]) { // iOS 5 sticks the UIWebFormView inside a UIPeripheralHostView. if ([[possibleFormView description] rangeOfString:@"UIPeripheralHostView"].location != NSNotFound) { for (UIView *subviewWhichIsPossibleFormView in [possibleFormView subviews]) { if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIWebFormAccessory"].location != NSNotFound) { [subviewWhichIsPossibleFormView removeFromSuperview]; } } } } } 

Esto funciona bien.

url: http://ios-blog.co.uk/iphone-development-tutorials/rich-text-editor-inserting-images-part-6/

Esto es una adición a la respuesta de Yun. En iOS6 (6.0.1) puede haber un borde gris horizontal o una línea de sombra en la parte superior de la fila donde el accesorio (anterior / siguiente / terminado) solía estar antes de que se eliminara. Esta solución funciona para mí y me gustaría compartirla. Tengo curiosidad por saber si también te funciona.

Para eliminar el borde, agregué este código al bucle interno de removeBar ():

 if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIImageView"].location != NSNotFound) { [[subviewWhichIsPossibleFormView layer] setOpacity: 0.0]; } 

Debemos agregar el marco QuartzCore a la cabeza del file .m, para que podamos establecer la opacidad de la capa involucrada.

Entonces obtenemos:

 ... #import <QuartzCore/QuartzCore.h> ... - (void)removeBar { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication shanetworkingApplication] windows]) { if (![[testWindow class] isEqual:[UIWindow class]]) { keyboardWindow = testWindow; break; } } for (UIView *possibleFormView in [keyboardWindow subviews]) { // iOS 5 sticks the UIWebFormView inside a UIPeripheralHostView. if ([[possibleFormView description] rangeOfString:@"UIPeripheralHostView"].location != NSNotFound) { for (UIView *subviewWhichIsPossibleFormView in [possibleFormView subviews]) { if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIWebFormAccessory"].location != NSNotFound) { [subviewWhichIsPossibleFormView removeFromSuperview]; } // iOS 6 leaves a grey border / shadow above the hidden accessory row if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIImageView"].location != NSNotFound) { // we need to add the QuartzCore framework for the next line [[subviewWhichIsPossibleFormView layer] setOpacity: 0.0]; } } } } } 

Parece que hay una manera muy simple, pero estoy bastante seguro de que no pasará la revisión de App Store. Tal vez alguien tiene una idea inteligente? 😉

 @interface UIWebBrowserView : UIView @end @interface UIWebBrowserView (UIWebBrowserView_Additions) @end @implementation UIWebBrowserView (UIWebBrowserView_Additions) - (id)inputAccessoryView { return nil; } @end 

No hay API públicas para hacer esto. Podría eliminarlo examinando la jerarquía de vista y eliminando la vista como algunos han sugerido, pero esto sería muy arriesgado.

He aquí por qué es una mala idea:

Si Apple no tiene una API oficial para eliminar la barra, pueden tener buenas razones para hacerlo, y su propio código puede depender de que esté allí. Es posible que nunca encuentre un problema porque realiza todas las testings (por ejemplo) en un keyboard inglés. Pero, ¿qué pasa si la vista que está eliminando es necesaria para ingresar a otro idioma, o para fines de accesibilidad? ¿O qué pasa si en una versión futura de iOS su propia implementación cambia de tal manera que asume que la vista siempre está ahí? Su código se bloqueará, y se bloqueará para get una actualización, mientras que los usuarios frustrados esperarán semanas.

Curiosamente, la respuesta adjunta de Remco demuestra este punto. En iOS 6.0.1, se realizó un cambio que requirió una solución al hack. Cualquiera que hubiera implementado el hack para ios 5 se habría visto obligado a hacer una actualización como resultado. Afortunadamente fue solo un cambio estético, pero podría haber sido mucho peor.

Estaba pensando en interceptar la notificación UIKeyboardWillAppear y, en su lugar, dársela a un campo de text oculto, y reenviar los events a través de javascript a la real en la vista web. Pero parece peludo. El movimiento y la selección del cursor de las cosas chuparían.

Mira esta. https://gist.github.com/2048571 Funciona en iOS 5 y versiones posteriores, no funciona para versiones anteriores.

este código definitivamente funciona para mí … espero que esto también funcione para usted.

 - (void)viewDidLoad{ [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } -(void)viewWillAppear:(BOOL)animated{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; } - (void)keyboardWillShow:(NSNotification *)notification { [self performSelector:@selector(removeBar) withObject:nil afterDelay:0]; } - (void)removeBar { // Locate non-UIWindow. UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication shanetworkingApplication] windows]) { if (![[testWindow class] isEqual:[UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([[possibleFormView description] hasPrefix:@"<UIPeripheralHostView"]) { for (UIView* peripheralView in [possibleFormView subviews]) { // hides the backdrop (iOS 7) if ([[peripheralView description] hasPrefix:@"<UIKBInputBackdropView"]) { //skip the keyboard background....hide only the toolbar background if ([peripheralView frame].origin.y == 0){ [[peripheralView layer] setOpacity:0.0]; } } // hides the accessory bar if ([[peripheralView description] hasPrefix:@"<UIWebFormAccessory"]) { // remove the extra scroll space for the form accessory bar UIScrollView *webScroll; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0) { webScroll = [[self webviewpot] scrollView]; } else { webScroll = [[[self webviewpot] subviews] lastObject]; } CGRect newFrame = webScroll.frame; newFrame.size.height += peripheralView.frame.size.height; webScroll.frame = newFrame; // remove the form accessory bar [peripheralView removeFromSuperview]; } // hides the thin grey line used to adorn the bar (iOS 6) if ([[peripheralView description] hasPrefix:@"<UIImageView"]) { [[peripheralView layer] setOpacity:0.0]; } } } } } 

No es fácil. Podrías tratar de hurgar en las subvistas en la vista web, pero sería un tabú con Apple.

¿Qué le parece si no coloca el campo de text en la página web en el lado web y agrega explícitamente su campo de text / vista de text a la vista web para que no muestre la barra de navigation en absoluto y pueda agregar la suya desde cero?

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; -(void)keyboardWasShown:(NSNotification*)aNotification { UIWindow* tempWindow; //Because we cant get access to the UIKeyboard throught the SDK we will just use UIView. //UIKeyboard is a subclass of UIView anyways UIView* keyboard; //Check each window in our application for(int c = 0; c < [[[UIApplication shanetworkingApplication] windows] count]; c ++) { //Get a reference of the current window tempWindow = [[[UIApplication shanetworkingApplication] windows] objectAtIndex:c]; //Get a reference of the current view for(int i = 0; i < [tempWindow.subviews count]; i++) { keyboard = [tempWindow.subviews objectAtIndex:i]; if([[keyboard description] hasPrefix:@"<UIPeripheralHostView"] == YES) { keyboard.hidden = YES; UIView* keyboardLayer; for(int n = 0; n < [keyboard.subviews count]; n++) { keyboardLayer = [keyboard.subviews objectAtIndex:n]; NSLog(@" keyboardLayer ::: %@ " ,keyboardLayer); if([[keyboardLayer description] hasPrefix:@"<UIWebFormAccessory"] == YES) { [keyboardLayer removeFromSuperview ]; } } keyboard.hidden = NO; } } } NSLog(@"keyboardWasShown" ); } 

revisa esto también: http://pastebin.com/s3Fkxvsk