- (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];