前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WKWebView长按保存图片逻辑

WKWebView长按保存图片逻辑

作者头像
freesan44
发布2020-05-18 15:36:58
2.7K0
发布2020-05-18 15:36:58
举报
文章被收录于专栏:freesan44freesan44

问题

在WKWebView上的图片,长按会触发系统控件进行保存和共享,但通过系统共享是没法分享图片,只能进行长按手势覆盖,然后用本地控件实现

解决方案

  1. 屏蔽WebKit的长按逻辑
代码语言:javascript
复制
 //禁止长按逻辑
    NSMutableString *javascript = [NSMutableString string];
    [javascript appendString:@"document.documentElement.style.webkitTouchCallout='none';"];//禁止长按
    WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [config.userContentController addUserScript:noneSelectScript];
  1. 添加长按手势
代码语言:javascript
复制
-(void)addLongPressGesture
{
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(startLongPress:)];
    longPress.delegate = self;

    longPress.minimumPressDuration = 0.4f;
    longPress.numberOfTouchesRequired = 1;
    longPress.cancelsTouchesInView = YES;
    [self.locationWebView addGestureRecognizer:longPress];
    
}
- (void)startLongPress:(UILongPressGestureRecognizer *)pressSender
{
    if(pressSender.state == UIGestureRecognizerStateBegan){

       //实现相关功能
        [self detectInWebView:pressSender];
        DebugLog(@"1. 开始长按手势");

    }else if(pressSender.state == UIGestureRecognizerStateEnded){

        //可以添加你长按手势执行的方法,不过是在手指松开后执行
        DebugLog(@"2. 结束长按手势");

    }else if(pressSender.state == UIGestureRecognizerStateChanged){

        //在手指点下去一直不松开的状态执行
        DebugLog(@"3. 长按手势改变");
    }
}
  1. 手势中捕捉图片进行处理
代码语言:javascript
复制
- (void)detectInWebView:(UIGestureRecognizer *)ges{

    CGPoint touchPoint = [ges locationInView:ges.view];
    NSString *jsString = [NSString stringWithFormat:@"function getURLandRect(){\
                              var ele=document.elementFromPoint(%f, %f);\
                              var url=ele.src;\
                              var jsonString= `{\"url\":\"${url}\"}`;\
                              return(jsonString)} getURLandRect()", touchPoint.x, touchPoint.y];
    [self.locationWebView evaluateJavaScript:jsString completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        NSData *data = [result dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary*resultDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSString* imageURL = resultDic[@"url"];
        if(imageURL.length==0|| [imageURL isEqualToString:@"undefined"]) {
            return;
        }
        NSData* imageData=nil;
        if(([imageURL hasPrefix:@"http"])) {
            imageData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]] returningResponse:NULL error:NULL];
            
        }else{
            NSString*dataString = [[imageURL componentsSeparatedByString:@","]lastObject];
//            imageData = [dataString dataUsingEncoding:NSUTF8StringEncoding];
            imageData = [[NSData alloc] initWithBase64EncodedString:dataString options:NSDataBase64DecodingIgnoreUnknownCharacters];
            
        }
        UIImage*image=[UIImage imageWithData:imageData];
        if(image) {
            //弹框处理
            [self.webModel popoverImageAlertWithImage:image Controller:self];
        }
    }];
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档