今天遇到一个问题,我们使用的网页视图<wkwebview>页面里面有输入框,需要调用我们键盘,但是键盘上面就有一个工具条,有上下箭头和完成按钮,因为网页上面嵌套的东西比较多,所以工具条的上下按钮点击之后会让我的网页内部内容偏移,很无奈,
解决:隐藏工具条
创建一个工具类,使用runtime替换系统创建工具条的方法然后置空
- SHNoInputAccessoryView.h
#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
#import <objc/runtime.h>
@interface SHNoInputAccessoryView : NSObject
- (void)removeInputAccessoryViewFromWKWebView:(WKWebView *)webView;
@end
- SHNoInputAccessoryView.m
@implementation SHNoInputAccessoryView
- (id)inputAccessoryView{
return nil;
}
- (void)removeInputAccessoryViewFromWKWebView:(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([SHNoInputAccessoryView class], @selector(inputAccessoryView));
class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method));
objc_registerClassPair(newClass);
}
object_setClass(targetView, newClass);
}
@end
- 使用方法如下
_wkwebView = [[WKWebView alloc]initWithFrame:CGRectZero configuration:configuration];
SHNoInputAccessoryView *noInputView = [[SHNoInputAccessoryView alloc] init];
[noInputView removeInputAccessoryViewFromWKWebView:_wkwebView];
注:上面代码wkwebview的创建方式没有要求的啊,因为我使用了Masonry所以这里没有给fame,根据下面的两行代码创建调用即可
收工