WKWebView长按保存图片逻辑

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

问题

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

解决方案

  1. 屏蔽WebKit的长按逻辑
//禁止长按逻辑
    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. 添加长按手势
-(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. 手势中捕捉图片进行处理
- (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];
        }
    }];
}


目录
相关文章
|
移动开发 前端开发 HTML5
前端下载图片的N种方法
前端下载图片的N种方法
411 0
前端下载图片的N种方法
|
API iOS开发
iOS开发-SDWebImage的回调不addSubView不会调用
iOS开发-SDWebImage的回调不addSubView不会调用
76 0
iOS开发-SDWebImage的回调不addSubView不会调用
|
缓存
封装一下图片下载功能
封装一下图片下载功能
99 0
封装一下图片下载功能
|
安全
WKWebView加载PDF屏蔽长按功能弹框
近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗
160 0
UIRefreshControl代码刷新
UIRefreshControl代码刷新
71 0
|
XML 数据格式
图片加载错乱,Glide无法设置Tag解决方式
图片加载错乱,Glide无法设置Tag解决方式
347 0
|
缓存 Android开发
Android笔记:使用Glide加载图片刷新时会闪烁
Android笔记:使用Glide加载图片刷新时会闪烁
1254 0