WKWebView获取H5页面里图片地址以及图片相对视图窗口的坐标的方法


WKWebView获取H5页面里图片地址以及图片相对视图窗口的坐标的方法


最近有个需求是点击放大查看H5内容页面的图片,寻找到一个比较轻量的库YHPhotoBrowser,其中根据图片位置来缩放的动画需要传递一个图片所在屏幕里的位置CGRect,想获取H5的图片坐标那就需要JS注入了

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
    CGPoint touchPoint = [recognizer locationInView:self.webView];
    NSString *jsString = [NSString stringWithFormat:@"function getURLandRect(){\
                            var ele=document.elementFromPoint(%f, %f);\
                            var url=ele.src;\
                            var left=ele.getBoundingClientRect().left;\
                            var top=ele.getBoundingClientRect().top;\
                            var width=ele.getBoundingClientRect().width;\
                            var height=ele.getBoundingClientRect().height;\
                            var jsonString= `{\"url\":\"${url}\",\"left\":\"${left}\",\"top\":\"${top}\",\"width\":\"${width}\",\"height\":\"${height}\"}`;\
                            return(jsonString)} getURLandRect()", touchPoint.x, touchPoint.y];
    
    [self.webView evaluateJavaScript:jsString completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        NSDictionary *resultDic = [SmallTools convertToDictionary:(NSString *)result];
        NSString *imageURL = [SmallTools isNullToString:resultDic[@"url"]];
        if (imageURL.length == 0 || [imageURL isEqualToString:@"undefined"]) {
            return;
        }
        CGFloat imgX = [resultDic[@"left"] floatValue];
        CGFloat imgY = [resultDic[@"top"] floatValue] + NAV_HEIGHT + 5;
        CGFloat imgW = [resultDic[@"width"] floatValue];
        CGFloat imgH = [resultDic[@"height"] floatValue];
        
        self.photoView = [[YHPhotoBrowser alloc]init];
        self.photoView.sourceView = self.view; //图片所在的父容器
        self.photoView.urlImgArr = @[imageURL]; //网络链接图片的数组
        if (imgX && imgY && imgW && imgH) { //原图片所在屏幕位置
            self.photoView.sourceRect = CGRectMake(imgX, imgY, imgW, imgH);
        }
        self.photoView.indexTag = 0; //初始化进去显示的图片下标
        [self.view addSubview:self.photoView]; //叠加在当前VC上
    }];
}

这个JS方法document.elementFromPoint(%f, %f)根据传入的点返回该点最上层的对象,通过src找到图片的链接,然后getBoundingClientRect()方法能返回对象的八个属性left, top, right, bottom, x, y, width, height,根据需要获取相应属性构造原图的CGRect即可

这里附带一下判断NSString合法性以及JSON字符串转NSDictionary的工具方法

+ (NSString *)isNullToString:(id)string {
    if ([string isEqual:@"NULL"] || [string isKindOfClass:[NSNull class]] || [string isEqual:[NSNull null]] || [string isEqual:NULL] || [[string class] isSubclassOfClass:[NSNull class]] || string == nil || string == NULL || [string isKindOfClass:[NSNull class]] || [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]==0 || [string isEqualToString:@"<null>"] || [string isEqualToString:@"(null)"]) {
        return @"";
    } else {
        return (NSString *)string;
    }
}
+ (NSDictionary *)convertToDictionary:(NSString *)jsonStr {
    NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *tempDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    return tempDic;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,626评论 1 45
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • (原创) 2017-6-20 最近刚刚实现的功能, 分享一下经验 (原谅文章没有句号, 为了开发方便我设置的中文下...
    VeryView阅读 4,428评论 1 10
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,790评论 1 92
  • 5、作品营销之修图:滤镜、身材高挑、网红脸、三分靠拍,七分靠修图 6、作品营销之做海报、作品做成海报、版图、大占手...
    王淳可阅读 316评论 0 0