问题
在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];
}
}];
}
网友评论