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];
        }
    }];
}


目录
相关文章
|
11月前
|
小程序 JavaScript 前端开发
小程序封装加载动画
在小程序的开发中,页面的加载过程可能会因为网络状况的不好或数据量的过大而显得非常缓慢,这时候加上一个加载动画就能有效的缓解用户的等待焦虑感。而对于应用的多个页面来说,使用全局加载动画可以提高用户体验,让应用显得更加美观和专业。本篇技术分享博客将为大家介绍在小程序中封装全局加载动画的具体实现步骤,帮助您提高小程序的用户体验。通过上述步骤,我们就完成了小程序中封装全局加载动画的具体实现方法。在实际开发中,我们可以根据实际需求对组件样式和方法进行调整和修改,以满足不同的开发需求。
211 0
|
API iOS开发
iOS开发-SDWebImage的回调不addSubView不会调用
iOS开发-SDWebImage的回调不addSubView不会调用
65 0
iOS开发-SDWebImage的回调不addSubView不会调用
|
缓存
封装一下图片下载功能
封装一下图片下载功能
83 0
封装一下图片下载功能
|
前端开发
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
91 0
使用SpringMvc跨服务器上传图片,Ajax异步刷新图片框显示图片功能请求不到后台,onChange事件没有激活的源码?
|
安全
WKWebView加载PDF屏蔽长按功能弹框
近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗
137 0
|
XML 数据格式
图片加载错乱,Glide无法设置Tag解决方式
图片加载错乱,Glide无法设置Tag解决方式
313 0