UIWebview获取网页中所有图片并加入点击事件,实现浏览图片的效果
来源:互联网 发布:圆谷官方奥特曼数据 编辑:程序博客网 时间:2024/05/17 10:25
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
//调整字号
NSString *str = @"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '95%'";
[_webView stringByEvaluatingJavaScriptFromString:str];
//js方法遍历图片添加点击事件 返回图片个数
static NSString * const jsGetImages =
@"function getImages(){\
var objs = document.getElementsByTagName(\"img\");\
for(var i=0;i<objs.length;i++){\
objs[i].onclick=function(){\
document.location=\"myweb:imageClick:\"+this.src;\
};\
};\
return objs.length;\
};";
[_webView stringByEvaluatingJavaScriptFromString:jsGetImages];//注入js方法
//注入自定义的js方法后别忘了调用 否则不会生效(不调用也一样生效了,,,不明白)
NSString *resurlt = [_webView stringByEvaluatingJavaScriptFromString:@"getImages()"];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//将url转换为string
NSString *requestString = [[request URL] absoluteString];
//hasPrefix 判断创建的字符串内容是否以pic:字符开始
if ([requestString hasPrefix:@"myweb:imageClick:"]) {
NSString *imageUrl = [requestString substringFromIndex:@"myweb:imageClick:".length];
self.navigationController.navigationBarHidden = YES;
if (_bgView && [imageUrl isEqualToString:_imgUrl]) {
//设置不隐藏,还原放大缩小,显示图片
_bgView.hidden = NO;
}else if (_bgView){
_bgView.hidden = NO;
_webImage = nil;
_webImgdata = nil;
_indicatorView = nil;
[self addImgWithUrl:imageUrl];
_imgUrl = imageUrl;
}else{
[self showBigImage:imageUrl];//创建视图并显示图片
_imgUrl = imageUrl;
}
return NO;
}
return YES;
}
#pragma mark 显示大图片
-(void)showBigImage:(NSString *)imageUrl{
//创建灰色透明背景,使其背后内容不可操作
_bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
[_bgView setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:_bgView];
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancel)];
[_bgView addGestureRecognizer:gesture];
_indicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[_indicatorView setFrame:CGRectMake(self.view.centerX, self.view.centerY, 50, 50)];
_indicatorView.hidesWhenStopped = YES;
[_indicatorView startAnimating];
//创建显示图像视图
_imgView = [[UIImageView alloc] init];
_imgView.userInteractionEnabled = YES;
[self addImgWithUrl:imageUrl];
[_bgView addSubview:_imgView];
//添加捏合手势
[_imgView addGestureRecognizer:[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)]];
[_imgView addGestureRecognizer:[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)]];
}
-(void)addImgWithUrl:(NSString *)imageUrl
{
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *url = [NSURL URLWithString:imageUrl];
_webImgdata = [NSData dataWithContentsOfURL:url];
_webImage = [UIImage imageWithData:_webImgdata];
[_indicatorView stopAnimating];
CGFloat imageH;
CGFloat imageW;
if (_webImage.size.height >= SCREEN_HEIGHT && _webImage.size.height > _webImage.size.width*1.5) {
imageW = (SCREEN_HEIGHT*1.0)/_webImage.size.height * _webImage.size.width;
[_imgView setSize:CGSizeMake(imageW, SCREEN_HEIGHT)];
}else{
imageH = (SCREEN_WIDTH*1.0)/_webImage.size.width * _webImage.size.height;
[_imgView setSize:CGSizeMake(SCREEN_WIDTH, imageH)];
}
[_imgView setCenter:_bgView.center];
[_imgView setImage:_webImage];
});
}
-(void)cancel
{
self.navigationController.navigationBarHidden = NO;
_bgView.hidden = YES;
}
//关闭按钮
-(void)removeBigImage
{
_bgView.hidden = YES;
}
- (void) handlePinch:(UIPinchGestureRecognizer*) recognizer
{
//缩放:设置缩放比例
recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1;
}
- (void) handlePan:(UIPanGestureRecognizer*) recognizer
{
//视图前置操作
[recognizer.view.superview bringSubviewToFront:recognizer.view];
CGPoint center = recognizer.view.center;
CGFloat cornerRadius = recognizer.view.frame.size.width / 2;
CGPoint translation = [recognizer translationInView:self.view];
//NSLog(@"%@", NSStringFromCGPoint(translation));
recognizer.view.center = CGPointMake(center.x + translation.x, center.y + translation.y);
[recognizer setTranslation:CGPointZero inView:self.view];
if (recognizer.state == UIGestureRecognizerStateEnded) {
//计算速度向量的长度,当他小于200时,滑行会很短
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
//NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); //e.g. 397.973175, slideMult: 1.989866
//基于速度和速度因素计算一个终点
float slideFactor = 0.1 * slideMult;
CGPoint finalPoint = CGPointMake(center.x + (velocity.x * slideFactor),
center.y + (velocity.y * slideFactor));
//限制最小[cornerRadius]和最大边界值[self.view.bounds.size.width - cornerRadius],以免拖动出屏幕界限
finalPoint.x = MIN(MAX(finalPoint.x, cornerRadius),
self.view.bounds.size.width - cornerRadius);
finalPoint.y = MIN(MAX(finalPoint.y, cornerRadius),
self.view.bounds.size.height - cornerRadius);
//使用 UIView 动画使 view 滑行到终点
[UIView animateWithDuration:slideFactor*2
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
recognizer.view.center = CGPointMake(_bgView.centerX, center.y);
}
completion:nil];
}
}
另附一个小问题:
在开发中使用uiwebview的时候会碰到在空间的四周出现一条黑线的问题。解决办法如下
UIWebView *web=[[UIWebView alloc] init];
web.opaque=NO;
web.backgroundColor=[UIColor clearColor];
- UIWebview获取网页中所有图片并加入点击事件,实现浏览图片的效果
- iOS WebView 如何通过js获取网页中所有图片并加入点击事件,实现浏览图片的功能
- 进击的KFC:iOS WebView 如何通过js获取网页中所有图片并加入点击事件,实现浏览图片的功能
- UIWebview点击图片实现大图浏览
- Android点击WebView中的图片获取指定标签段的所有图片实现缩放及滑动浏览-PhotoView
- webview中添加点击图片浏览事件
- iOS中UIWebView使用JS交互:实现图片的点击
- python获取网页中所有图片并筛选指定分辨率
- iOS开发之点击UIWebView获取被点击图片的地址并显示
- 仿微信点击图片放大,并可滑动浏览效果
- UIWebView点击图片获取图片的链接URL
- 在Android中使用加载器(Loader)来实现获取本机中的所有图片,并进行查看图片的效果
- 数据库获取图片 加入幻灯效果 点击查看详细信息
- 正则表达式获取网页中所有图片的路径
- 点击UIWebView获取图片的URL的两种方法
- ServletContext类的用法---网页点击量/留言板/图片浏览
- iOS开发 UIWebView获取点击图片
- Android中图片实现按钮点击效果
- C#反射:GetManifestResourceStream 获取项目资源为空解决方案
- class文件结构
- Unity与Java通信
- java对redis的基本操作
- C/C++中指向指针的指针传递函数
- UIWebview获取网页中所有图片并加入点击事件,实现浏览图片的效果
- a/b测试,不要再拍脑袋决策了!看看fb/google怎么玩?
- 通过JNI调用android驱动
- Codeforces Round #346 (Div. 2)(A)模拟
- Android Native Crash的log分析和定位
- 使用passport-local-mongoose、passport实现用户验证
- angularjs2学习教程
- openssl-1.0.0b - libssl 移植到ARM Linux
- 一天一排序之“归并排序(mergesort)”