使用WKWebview实现这个功能

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation

{ //加载页面完成

//js方法遍历图片添加点击事件 返回图片个数

/*这块我着重说几句

逻辑:

1.遍历获取全部的图片;

2.生成一个Srting为所有图片的拼接,拼接时拿到所处数组下标;

3.为图片添加点击事件,并添加数组所处下标

注意点:

1.如果仅仅拿到url而无下标的话,网页中如果有多张相同地址的图片 则会发生位置错乱

2.声明时不要用 var 用 let 不然方法添加的i 永远是length的值

(这里有个bug,就是用let声明的话 在iOS8 和iOS9的系统下)注入js不成功 但是其他系统可以 用var的话就是每次点击都是最后一张

for(let i=0;i

imgScr = imgScr + objs[i].src +'YBindex'+ i +'Y+B';\

objs[i].οnclick=function(){\

document.location=\"myweb:imageClick:\"+this.src + 'YBindex' + arg;\

};\

};\

在查阅了好多资料之后改成是用var声明之后可以完美解决这个问题

for(var i=0;i

imgScr = imgScr + objs[i].src +'YBindex'+ i +'Y+B';\

(function(arg){\

objs[arg].οnclick=function(){\

document.location=\"myweb:imageClick:\"+this.src + 'YBindex' + arg;\

};\

})(i); \

};\

//参考https://www.cnblogs.com/blogs-8888/p/6437350.html

*/

static NSString * const jsGetImages =

@"function getImages(){\

var objs = document.getElementsByTagName(\"img\");\

var imgScr = '';\

for(var i=0;i

imgScr = imgScr + objs[i].src +'YBindex'+ i +'Y+B';\

(function(arg){\

objs[arg].οnclick=function(){\

document.location=\"myweb:imageClick:\"+this.src + 'YBindex' + arg;\

};\

})(i); \

};\

return imgScr;\

};";

[webView evaluateJavaScript:jsGetImages completionHandler:^(id _Nullable result, NSError * _Nullable error) {

NSLog(@"运行:%@ %@",result,error);

}];

[webView evaluateJavaScript:@"getImages()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {

NSLog(@"运行:%@ %@",result,error);

NSString *urlResurlt = result;

allUrlArray = [NSMutableArray arrayWithArray:[urlResurlt componentsSeparatedByString:@"Y+B"]];

if (allUrlArray.count >= 2) {

[allUrlArray removeLastObject];// 此时数组为每一个图片的url

}

}];

}

在下面函数中截获点击的事件和点击图片的下标

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

NSString *requestString = navigationAction.request.URL.absoluteString;

//hasPrefix 判断创建的字符串内容是否以pic:字符开始

NSLog(@"requestString:%@",requestString);

if ([requestString hasPrefix:@"myweb:imageClick:"]) {

NSString *imageUrl = [requestString substringFromIndex:@"myweb:imageClick:".length];

[self showBigImage:imageUrl];//创建视图并显示图片

}

decisionHandler(WKNavigationActionPolicyAllow);

}

#pragma mark 显示大图片

-(void)showBigImage:(NSString *)imageUrl{

NSMutableArray *allImagesUrl = [NSMutableArray array];

//分解出所有图片的链接地址

for (int i = 0; i < allUrlArray.count; i++) {

NSArray *imageIndex = [NSMutableArray arrayWithArray:[allUrlArray[i] componentsSeparatedByString:@"YBindex"]];

NSString *imgStr = imageIndex.firstObject;

//这里出现了一个问题就是拿到的所有的图片有一个链接是web本身页面的地址 不知道怎么产生的 在这里判断下去掉

if (![imgStr isEqualToString:requestURLString]) {

[allImagesUrl addObject:imgStr];

}

}

NSArray *imageIndex = [NSMutableArray arrayWithArray:[imageUrl componentsSeparatedByString:@"YBindex"]];

//点击图片的下标(第几张)

int i = [imageIndex.lastObject intValue];

LLPhotoBrowser *photoBrowser = [[LLPhotoBrowser alloc] initWithImages:allImagesUrl currentIndex:i];

// photoBrowser.delegate = self;

[self presentViewController:photoBrowser animated:YES completion:nil];

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐