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

    

    //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 allocinitWithFrame:CGRectMake(00SCREEN_WIDTHSCREEN_HEIGHT)];

    [_bgView setBackgroundColor:[UIColor blackColor]];

    [self.view addSubview:_bgView];

    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer allocinitWithTarget:self action:@selector(cancel)];

    [_bgView addGestureRecognizer:gesture];

    

    _indicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

    [_indicatorView setFrame:CGRectMake(self.view.centerXself.view.centerY5050)];

    _indicatorView.hidesWhenStopped = YES;

    [_indicatorView startAnimating];

    

    //创建显示图像视图

    _imgView = [[UIImageView allocinit];

    _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 allocinit];

            web.opaque=NO;

            web.backgroundColor=[UIColor clearColor];



0 0
原创粉丝点击