美文网首页iOS收藏IOS开发UIWebView与WKWebView的使用
WKWebView实现长按保存图片 长按识别二维码

WKWebView实现长按保存图片 长按识别二维码

作者: ElegantLiar | 来源:发表于2016-10-09 16:07 被阅读4346次

    思路:WKWebView与JS交互, 获取长按位置图片url, 获取图片资源, 保存到本地相册

    对比UIWebView JS代码执行改变:

    WKWebView执行完毕假如有返回参数通过completionHandler:Block回调出来
    - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
    
    UIWebView执行JS代码直接返回
    - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    

    给WKWebView添加手势

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1;
    longPress.delegate = self;
    [_webView addGestureRecognizer:longPress];
    [self.view addSubview:_webView];
    

    屏蔽前端页面自带的长按弹出列表

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    // 不执行前段界面弹出列表的JS代码
    [self.webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" 
    

    获取长按点击位置对应的图片url (JS交互)

    - (void)handleLongPress:(UILongPressGestureRecognizer *)sender{
    if (sender.state != UIGestureRecognizerStateBegan) {
    return;
    }
    CGPoint touchPoint = [sender locationInView:self.webView];
    // 获取长按位置对应的图片url的JS代码
    NSString *imgJS = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y];
    // 执行对应的JS代码 获取url
    [self.webView evaluateJavaScript:imgJS completionHandler:^(id _Nullable imgUrl, NSError * _Nullable error) {
    if (imgUrl) {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]];
    UIImage *image = [UIImage imageWithData:data];
    if (!image) {
    NSLog(@"读取图片失败");
    return;
    }
    _saveImage = image;
    FSActionSheet *actionSheet = nil;
    if ([self isAvailableQRcodeIn:image]) {
    actionSheet = [[FSActionSheet alloc] initWithTitle:nil
    delegate:self
    cancelButtonTitle:@"取消"
    highlightedButtonTitle:nil
    otherButtonTitles:@[@"保存图片", @"打开二维码"]];
    } else {
    actionSheet = [[FSActionSheet alloc] initWithTitle:nil
    delegate:self
    cancelButtonTitle:@"取消"
    highlightedButtonTitle:nil
    otherButtonTitles:@[@"保存图片"]];
    }
    [actionSheet show];
    }
    }];
    

    github Demo请点此

    相关文章

      网友评论

      • 895212d73d10:可以从WKWebView的缓存中获取图片么,把图片下载下来再识别速度太慢了
      • ValienZh:可以从WKWebView的缓存中获取图片么
        ElegantLiar:https://www.jianshu.com/p/0cd0e64ebd91 这篇文章不知道能不能帮到你 没有查到相关资料了
      • 那一处风景ljz:楼主 if (imgUrl)这个语句不走,长按imgUrl为null,但是wkwebview中确实有图片,,怎么办
      • 芥末味儿:为什么扫码前要给图片加上个边框呢?
        ElegantLiar:@芥末味儿 当时应该是考虑到能让图片更好识别, 加了边框, 对图片的颜色稍微处理了一下, 让二维码对比更加明显一些
        芥末味儿:@ElegantLiar 但是我试过不对图片处理直接识别,有的识别不出来,加上边框后能识别
        ElegantLiar:加边框跟识别没有关系, 只是想弄个简单的UI效果
      • 7eg:我没写代码,然后通过百度的页面长按图片,可以调起iOS保存图片,说明前端也可以实现这个功能了?:joy:
        7eg:是长按保存图片的功能
      • 上冬十二:@wenhao_fly 你看看是否基类或者本类手势代理方法的问题
      • 上冬十二:为什么我的手势响应方法不走呢
        shewa_fly:我的手势也不走啊?
        上冬十二:解决了
        ElegantLiar:解决了么? 可以把代码贴出来看下

      本文标题:WKWebView实现长按保存图片 长按识别二维码

      本文链接:https://www.haomeiwen.com/subject/njapyttx.html