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

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);
    }
    }




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • WebView·开车指南 目录 WebView简介 WebView基本使用 WebView常用方法 WebSett...
    南城的人阅读 4,738评论 0 19
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 高中和大学在朗读英文文章的时候都是想着要把手头上这篇文章顺顺利利的快速地读完,读的无论语速还是停顿都觉得往前赶。对...
    萧萧_健康管理阅读 505评论 0 0
  • 用故事思维去解决问题 我们无法通过智力影响别人,情感却能做到。——亚里士多德 讲一个让人感同身受的故事,让对方产生...
    知否专栏阅读 320评论 0 0