美文网首页实用轮子iOS1iOS控件使用大全
WebView浏览图片、显示加载进度条、仿微信显示关闭按钮

WebView浏览图片、显示加载进度条、仿微信显示关闭按钮

作者: ZhengYaWei | 来源:发表于2017-03-22 14:46 被阅读592次

    WebView中浏览图片、显示加载进度、仿微信显示关闭按钮这三个功能在不同的项目中都有写到,今天就给稍微整理一下,将三个功能整合到一起,才能算是一个相对比较完整的WebView。
    直接看效果图。Demo下载地址:https://github.com/ZhengYaWei1992/ZWWebView

    效果图

    1、网络加载进度条的展示

    这个效果的实现主要是监听estimatedProgress属性实现的。具体实现请参照:http://www.jianshu.com/p/a16e05a1b302

    2、显示关闭按钮

    关闭按钮的显示和隐藏,其实实现起来主要注意一点便可,具体实现是在下面这个代理方法中。

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
        
        NSString *requestString = navigationAction.request.URL.absoluteString;
        if ([requestString hasPrefix:@"myweb:imageClick:"]) {
            //获取单个照片地址
            NSString *imageUrl = [requestString substringFromIndex:@"myweb:imageClick:".length];
            //这里可以继续做一个简单的判断,如果图片网址是以gif结尾,可以用SDWebImage来加载gif图片
            [self showImageWithUrlString:imageUrl];
            
            decisionHandler(WKNavigationActionPolicyCancel);
        }else{
            //如果网页进入下一页面,显示返回按钮
            if (self.webView.canGoBack) {
                self.closeItem.hidden = NO;
            }else{//网页处于第一页面,隐藏返回按钮
                self.closeItem.hidden = YES;
            }
            //这个参数必须调用,类似于UIWebView开始加载的时候,返回的YES
            decisionHandler(WKNavigationActionPolicyAllow);
        }
    }```
    核心是在这个判断上  `if (self.webView.canGoBack) `canGoBack是webView的一个属性,更具这个属性可以设置关闭按钮的显示和返回按钮的点击事件隐藏。关闭按钮的布局以及实现如下。
    ######2.1 布局关闭按钮和返回按钮
    

    //设置导航栏Item

    • (void)setupNavbarItem{
      UIView * backView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 44)];
      UIButton * backItem = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 56, 44)];
      [backItem setImage:[UIImage imageNamed:@"back_arrow"] forState:UIControlStateNormal];
      [backItem setImageEdgeInsets:UIEdgeInsetsMake(0, -15, 0, 0)];
      [backItem setTitle:@"返回" forState:UIControlStateNormal];
      [backItem setTitleEdgeInsets:UIEdgeInsetsMake(0, -15, 0, 0)];
      [backItem setTitleColor:[UIColor colorWithRed:0.000 green:0.502 blue:1.000 alpha:1.000] forState:UIControlStateNormal];
      [backItem addTarget:self action:@selector(clickedBackItem:) forControlEvents:UIControlEventTouchUpInside];
      self.backItem = backItem;
      [backView addSubview:backItem];

      UIButton * closeItem = [[UIButton alloc]initWithFrame:CGRectMake(44+12, 0, 44, 44)];
      [closeItem setTitle:@"关闭" forState:UIControlStateNormal];
      [closeItem setTitleColor:[UIColor colorWithRed:0.000 green:0.502 blue:1.000 alpha:1.000] forState:UIControlStateNormal];
      [closeItem addTarget:self action:@selector(clickedCloseItem:) forControlEvents:UIControlEventTouchUpInside];
      closeItem.hidden = YES;
      self.closeItem = closeItem;
      [backView addSubview:closeItem];

      UIBarButtonItem * leftItemBar = [[UIBarButtonItem alloc]initWithCustomView:backView];
      self.navigationItem.leftBarButtonItem = leftItemBar;
      }

    ######2.2 返回按钮点击事件
    这要要控制返回按钮,当前加载的网页为首页的时候点击返回会返回上一界面,如果加载的网页不是首页,即显示了关闭按钮,这时点击返回按钮,webView会返回到上一页面。
    
    • (void)clickedBackItem:(UIBarButtonItem *)btn{
      if (self.webView.canGoBack) {
      [self.webView goBack];
      self.closeItem.hidden = NO;
      }else{
      [self clickedCloseItem:nil];
      }
      }
    ######2.1 关闭按钮点击事件
    
    • (void)clickedCloseItem:(UIButton *)btn{
      [self.navigationController popViewControllerAnimated:YES];
      }
    
    ###3、浏览网页图片
    弱项浏览网页的图片,第一步要做的是在网页加载成功的时候注入JS代码,更改`document.location`,之后在加载网页的时候根据`document.location`来区分发起的网络请求是否已是浏览图片。如这里就是将`document.location`改为myweb:imageClick:\"+this.src  其中,src是图片的地址。
    
    • (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
      //拼接js的代码
      NSMutableString *stringM = [NSMutableString string];
      //和预览图片相关的JS
      //要加上这两句代码 否则网页图片不显示,仅显示蓝色小标记
      [stringM appendString:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '95%';"];
      [stringM appendString:@"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;};"];
      //注入JS
      //[webView stringByEvaluatingJavaScriptFromString:stringM];//UIWebView UIWebView的注入方式
      [webView evaluateJavaScript:stringM completionHandler:nil];
      //注入自定义的js方法后别忘了调用 否则不会生效
      [webView evaluateJavaScript:@"getImages();" completionHandler:nil];
      }
    加载网络网页的时候根据url来区分点击的是否为图片对应的地址。如果是就调用`  [self showImageWithUrlString:imageUrl];`方法,传入URL显示图片。具体实现请看demo,demo下载地址在文章最上面。
    
    • (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

      NSString *requestString = navigationAction.request.URL.absoluteString;
      if ([requestString hasPrefix:@"myweb:imageClick:"]) {
      //获取单个照片地址
      NSString *imageUrl = [requestString substringFromIndex:@"myweb:imageClick:".length];
      //这里可以继续做一个简单的判断,如果图片网址是以gif结尾,可以用SDWebImage来加载gif图片
      [self showImageWithUrlString:imageUrl];

        decisionHandler(WKNavigationActionPolicyCancel);
      

      }else{
      //如果网页进入下一页面,显示返回按钮
      if (self.webView.canGoBack) {
      self.closeItem.hidden = NO;
      }else{//网页处于第一页面,隐藏返回按钮
      self.closeItem.hidden = YES;
      }
      //这个参数必须调用,类似于UIWebView开始加载的时候,返回的YES
      decisionHandler(WKNavigationActionPolicyAllow);
      }
      }

    
    
    
    

    相关文章

      网友评论

      • jkkkg:比较全面的样子

      本文标题:WebView浏览图片、显示加载进度条、仿微信显示关闭按钮

      本文链接:https://www.haomeiwen.com/subject/qgjonttx.html