项目里用 WKWebview 加载的 H5 里面有个头像上传的功能,H5使用了 <input type=file> 标签,可以不经过 iOS 原生处理就能直接打开相机或相册文件选取图片。现在的需求是要原生得到用户选择的图片后进行裁剪,把裁剪后的图片交给 H5 中显示。而 WKWebview 代理并没有提供相关的方法,从网上找到一种解决方法,具体可以看这篇帖子,说的挺详细的。
这里说说遇到的问题,在使用这个帖子的方法的时候,由于webview 放在了 navigationcontroller 里面,最后在自己实现弹出视图的时候方法调取不到。所以要加个判断,代码如下:
- (void)onFileInputIntercept {
// 当根视图为 UINavigationController 时,需要取出 navigation 对应的控制器
// 获取 window
UIWindow *mainWindow = [AppDelegate sharedAppDelegate].window;
// 如果以导航控制器作为根控制器
if ([mainWindow.rootViewController isKindOfClass:[UINavigationController class]]) {
__block NSInteger index;
[mainWindow.rootViewController.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// RootViewController 就是放了 webview 的 controller
if ([obj isKindOfClass:[RootViewController class]]) {
// 得到对应的控制器在导航控制器中的位置
index = idx;
}
}];
// 取出对应的控制器来实现方法
UIViewController *vc = [mainWindow.rootViewController.childViewControllers objectAtIndex:index];
if ([vc respondsToSelector:@selector(onFileInputClicked)]) {
[vc performSelector:@selector(onFileInputClicked)];
}
}
}
判断完之后,就可以做之后的操作了。