问题
在WKWebView上的图片,长按会触发系统控件进行保存和共享,但通过系统共享是没法分享图片,只能进行长按手势覆盖,然后用本地控件实现
解决方案
- 屏蔽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];
- 添加长按手势
-(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. 长按手势改变"); } }
- 手势中捕捉图片进行处理
- (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]; } }]; }