在默认情况下,iOS 使用 Webview 打开的网页,在进行表单输入时,弹出的键盘顶部会多出一个工具栏。
左边有两个上下按钮,右边有一个Done/完成按钮。这是用来切换输入框的,就像 PC 上按Tab键可以切换输入框一样。
为了让 App 中嵌入的 H5 更接近 Native,咱们可以去掉它。
UIWebView
UIWebView,可以使用[self hideKeyboardShortcutBar:self.webView]
去掉工具栏。
- (void) hideKeyboardShortcutBar: (UIView *)view
{
for (UIView *sub in view.subviews) {
[self hideKeyboardShortcutBar:sub];
if ([NSStringFromClass([sub class]) isEqualToString:@"UIWebBrowserView"]) {
Method method = class_getInstanceMethod(sub.class, @selector(inputAccessoryView));
IMP newImp = imp_implementationWithBlock(^(id _s) {
if ([sub respondsToSelector:@selector(inputAssistantItem)]) {
UITextInputAssistantItem *inputAssistantItem = [sub inputAssistantItem];
inputAssistantItem.leadingBarButtonGroups = @[];
inputAssistantItem.trailingBarButtonGroups = @[];
}
return nil;
});
method_setImplementation(method, newImp);
}
}
}
WKWebView
WKWebView,可以使用[self hideWKWebviewKeyboardShortcutBar:self.webView]
去掉工具栏。
// 步骤一:创建一个 _NoInputAccessoryView
@interface _NoInputAccessoryView : NSObject
@end
@implementation _NoInputAccessoryView
- (id)inputAccessoryView {
return nil;
}
@end
// 步骤二:去掉 WkWebviewe Done 工具栏
- (void) hideWKWebviewKeyboardShortcutBar:(WKWebView *)webView {
UIView *targetView;
for (UIView *view in webView.scrollView.subviews) {
if([[view.class description] hasPrefix:@"WKContent"]) {
targetView = view;
}
}
if (!targetView) {
return;
}
NSString *noInputAccessoryViewClassName = [NSString stringWithFormat:@"%@_NoInputAccessoryView", targetView.class.superclass];
Class newClass = NSClassFromString(noInputAccessoryViewClassName);
if(newClass == nil) {
newClass = objc_allocateClassPair(targetView.class, [noInputAccessoryViewClassName cStringUsingEncoding:NSASCIIStringEncoding], 0);
if(!newClass) {
return;
}
Method method = class_getInstanceMethod([_NoInputAccessoryView class], @selector(inputAccessoryView));
class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method));
objc_registerClassPair(newClass);
}
object_setClass(targetView, newClass);
}