当 webview 呈现 ImagePicker 时未调用 presentViewController
Posted
技术标签:
【中文标题】当 webview 呈现 ImagePicker 时未调用 presentViewController【英文标题】:presentViewController not called when webview presents ImagePicker 【发布时间】:2018-08-09 19:06:42 【问题描述】:我看到了几个问题,由于 UIWebView
调用它,所以在显示 imagepicker 时应该调用函数 presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
。
这是我的代码。
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
if([viewControllerToPresent.class isEqual:[UIImagePickerController class]])
UIImagePickerController *controller = (UIImagePickerController*)viewControllerToPresent;
controller.navigationBar.tintColor = UIColor.whiteColor;
[controller.navigationBar setTitleTextAttributes:
@NSForegroundColorAttributeName:[UIColor whiteColor]];
[controller.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[controller.navigationBar setBarTintColor:[UIColor blackColor]];
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
【问题讨论】:
【参考方案1】:当您在 Web 视图中使用 <input type="file">
标记并单击结果按钮时,保存您的 Web 视图的 ViewController
将调用该方法。
这个方法已经在UIViewController
中实现了,但是如果你想覆盖它,你可以在你的UIViewController
子类上这样做。迅速:
override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
super.present(viewControllerToPresent, animated: flag, completion: completion)
在 Objective-C 中:
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
值得注意的是,当我在 ios11 模拟器上测试时显示的控制器不是 UIImagePickerController
,而是实际上是 UIDocumentMenuViewController
,因此您上面的自定义代码将不起作用。
另外,请注意,您不应该再使用UIWebView
。你应该改用WKWebView
。
【讨论】:
两件事,当我使用 WKWebview 时,我的 imagepicker 控制器没有完成按钮,所以我切换回 uiwebview,WKWebview 也有很多关于 cookie 的问题,并且没有让我的用户登录其次,在呈现 2 个选项时会显示 UIDoucmentController,而不是单击照片库后,会显示一个图像选择器。当通过 uiwebview 单击 时,永远不会调用覆盖函数 presentViewController。 UIWebView 即将消失。您需要找到一种使用 WKWebView 的方法。至于调用,您在选择时看不到调用,因为它是在 UIDocumentMenuViewController 上而不是在您的 VC 上调用的。 YourVC 展示了 UIDocumentMenuViewController,它展示了 UIImagePickerController。【参考方案2】:该事件将在您的 ROOT 视图上调用,该视图可能是也可能不是您的 WebViewController。使用布局检查器查找您的根视图,或以编程方式从应用委托中检索根视图。
【讨论】:
以上是关于当 webview 呈现 ImagePicker 时未调用 presentViewController的主要内容,如果未能解决你的问题,请参考以下文章
在用户交互之前,Android WebView 无法完全呈现内容
Android:如何在webview中呈现html而不显示webview