实现Webview的看图模式

前言

由于公司项目需求,今天看了看关于js和webview交互的一些东西,由于以前没接触过这块,算是自己的一个盲区,因此记录下来,代码实现的过程很简短,先在此敲作一砖。

正文

1、获取 <img> 元素

在webview的代理方法webViewDidFinishLoad中用js实现对页面图片URL数组的获取:

static  NSString *const jsGetImages =
@"function getImages(){\
var objs = document.getElementsByTagName(\"img\");\
var imgScr = '';\
for(var i=0;i<objs.length;i++){\
imgScr = imgScr + objs[i].src + '+';\
};\
return imgScr;\
};";
//注入js方法
[webView stringByEvaluatingJavaScriptFromString:jsGetImages];
NSString *urlResurlt = [webView stringByEvaluatingJavaScriptFromString:@"getImages()"];

urlResurlt获取到的是URL字符串,将其拆分到数组:

_mUrlArray = [NSMutableArray arrayWithArray:[urlResurlt componentsSeparatedByString:@"+"]];
//去除最后一个空元素
if (_mUrlArray.count >= 2) {
    [_mUrlArray removeLastObject];
}

2、添加图片可点击js

[_webView stringByEvaluatingJavaScriptFromString:@"function registerImageClickAction(){\
 var imgs=document.getElementsByTagName('img');\
 var length=imgs.length;\
 for(var i=0;i<length;i++){\
 img=imgs[i];\
 img.onclick=function(){\
 window.location.href='image-preview:'+this.src}\
 }\
 }"];
[_webView stringByEvaluatingJavaScriptFromString:@"registerImageClickAction();"];

3、捕获到图片的点击事件

在webView的shouldStartLoadWithRequest代理方法中获取被点击图片的url:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([request.URL.scheme isEqualToString:@"image-preview"]) {
    NSString* path = [request.URL.absoluteString substringFromIndex:[@"image-preview:" length]];
    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //path 就是被点击图片的url
    [self loadPhotoWith:path];
    return NO;
}
return YES;
}

4、显示图片

这里我用的是IDMPhotoBrowser:
- (void)loadPhotoWith: (NSString *)path {
// URLs array
__block NSInteger index;//图片点击的序号
NSMutableArray *photosURL = [NSMutableArray array];
[_mUrlArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSURL *url = [NSURL URLWithString:obj];
[photosURL addObject:url];
if ([path isEqualToString:obj]) {
index = idx;
}
}];
// Create an array to store IDMPhoto objects
NSMutableArray *photos = [NSMutableArray new];
for (NSURL *url in photosURL) {
IDMPhoto *photo = [IDMPhoto photoWithURL:url];
[photos addObject:photo];
}
IDMPhotoBrowser *browser = [[IDMPhotoBrowser alloc] initWithPhotos:photos];
browser.displayCounterLabel = YES;
browser.displayActionButton = NO;
browser.displayArrowButton = YES;
[browser setInitialPageIndex:index];
[self presentViewController:browser animated:YES completion:nil];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,711评论 2 7
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不仅节约...
    RainyGY阅读 1,894评论 1 12
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不...
    宝宝teacher阅读 2,362评论 3 15
  • UIWebView的基本了解 什么是UIWebView1.UIVebView是系统内置的浏览器控件2.系统自带的s...
    Mario_ZJ阅读 2,823评论 0 2
  • 和办公室的的一群实习生相处了个月,现在都大家因为工作,学习分崩离析,看着大家一口气的喝下了最后的一杯柠檬水,好想说...
    我是一直流浪的猪阅读 490评论 0 2