Problema del teclado iOS 7 UIWebView

Tengo que eliminar esta barra como aquí enlace, pero para iOS 7 este código no funciona.

Eliminamos esta barra con algunos trucos de tiempo de ejecución de Objective C.

Tenemos una clase que tiene un método:

@interface _SwizzleHelper : NSObject @end @implementation _SwizzleHelper -(id)inputAccessoryView { return nil; } @end 

Una vez que tenemos una vista web de la que queremos quitar la barra, iteramos las subvistas de la vista de desplazamiento y tomamos la clase UIWebDocumentView . Luego dinámicamente hacemos que la superclase de la clase que creamos arriba sea la clase de la subvista (UIWebDocumentView, pero no podemos decir eso por adelantado porque es una API privada), y reemplazamos la clase de la subvista por nuestra clase.

 #import "objc/runtime.h" -(void)__removeInputAccessoryView { UIView* subview; for (UIView* view in self.scrollView.subviews) { if([[view.class description] hasPrefix:@"UIWeb"]) subview = view; } if(subview == nil) return; NSString* name = [NSString stringWithFormat:@"%@_SwizzleHelper", subview.class.superclass]; Class newClass = NSClassFromString(name); if(newClass == nil) { newClass = objc_allocateClassPair(subview.class, [name cStringUsingEncoding:NSASCIIStringEncoding], 0); if(!newClass) return; Method method = class_getInstanceMethod([_SwizzleHelper class], @selector(inputAccessoryView)); class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method)); objc_registerClassPair(newClass); } object_setClass(subview, newClass); } 

El equivalente de lo anterior en Swift 3.0:

 import UIKit import ObjectiveC var swizzledClassMapping = [AnyClass]() extension UIWebView { func noInputAccessoryView() -> UIView? { return nil } public func removeInputAccessoryView() { var subview: AnyObject? for (_, view) in scrollView.subviews.enumerated() { if NSStringFromClass(type(of: view)).hasPrefix("UIWeb") { subview = view } } guard subview != nil else { return } //Guard in case this method is called twice on the same webview. guard !(swizzledClassMapping as NSArray).contains(type(of: subview!)) else { return; } let className = "\type(of: subview!)_SwizzleHelper" var newClass : AnyClass? = NSClassFromString(className) if newClass == nil { newClass = objc_allocateClassPair(type(of: subview!), className, 0) guard newClass != nil else { return; } let method = class_getInstanceMethod(type(of: self), #selector(UIWebView.noInputAccessoryView)) class_addMethod(newClass!, #selector(getter: UIResponder.inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method)) objc_registerClassPair(newClass!) swizzledClassMapping += [newClass!] } object_setClass(subview!, newClass!) } } 

He hecho un cocoapod basado en esta publicación de blog de @bjhomer.

Puede reemplazar la vista de acceso inputa y no solo ocultarla. Espero que esto ayude a las personas con el mismo problema.

https://github.com/lauracpierre/FA_InputAccessoryViewWebView

Puedes encontrar la página de cocoapod aquí mismo .

Me encontré con esta increíble solución, pero también necesitaba recuperar inputAccessoryView. Agregué este método:

 - (void)__addInputAccessoryView { UIView* subview; for (UIView* view in self.scrollView.subviews) { if([[view.class description] hasSuffix:@"SwizzleHelper"]) subview = view; } if(subview == nil) return; Class newClass = subview.superclass; object_setClass(subview, newClass); } 

Parece que funciona según lo previsto sin efectos secundarios, pero no puedo deshacerme de la sensación de que mis pantalones están en llamas.

Si desea que la solución de Leo Natan funcione con WKWebView en lugar de UIWebView, simplemente cambie el prefijo de “UIWeb” a “WKContent”.

Creé una esencia para lograr esto: https://gist.github.com/kgaidis/5f9a8c7063b687cc3946fad6379c1a66

Es una categoría de UIWebView donde todo lo que haces es cambiar la propiedad customInputAccessoryView :

 @interface UIWebView (CustomInputAccessoryView) @property (strong, nonatomic) UIView *customInputAccessoryView; @end 

Puede configurarlo en nil para eliminarlo o puede establecer una nueva vista en él para cambiarlo.

Tenga en cuenta que esto también usa API privadas, por lo que debe utilizarla bajo su propio riesgo, pero parece que muchas aplicaciones hacen cosas similares.