UIWebView || WKWebView 中UIKeyBoa

2017-11-01  本文已影响193人  zero_zql

在UIWebView || WKWebView 中你会意外的发现web页面,input获取焦点弹出系统虚拟键盘时,挡住input,开始以为是我使用了IQKeyboardManager该库导致键盘带有 toolBar 显示,但是我已经在该类中禁止了该库的使用,接下来又写了个demo 发现了确实不是该库引起的问题,最终发现其是UIWebView键盘的accessoryBar自带的,苹果官方并没有给出方法,所以我们只能够自己来解决。有些方案大家可以上 https://stackoverflow.com 上查找相对比较多答案及准确性更高。

场景图示如下:

accessoryBar显示标示图

由于本人使用的是 WKWebView 下面就把相关的代码提供给大家参靠

建立一个 Nsobject 类

.h 文件

#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>

@interface NoInputAccessoryView : NSObject

- (void)removeInputAccessoryViewFromWKWebView:(WKWebView *)webView;


@end

.m 文件

#import "NoInputAccessoryView.h"
#import "BasewebViewController.h"

@implementation NoInputAccessoryView
- (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([BasewebViewController class], @selector(inputAccessoryView));
        
        class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method));
        
        objc_registerClassPair(newClass);
    }
    object_setClass(targetView, newClass);
}
@end

类中调用方式:

   NoInputAccessoryView *noInputAccessoryView = [NoInputAccessoryView new];
   [noInputAccessoryView removeInputAccessoryViewFromWKWebView:_WebView];
上一篇 下一篇

猜你喜欢

热点阅读