美文网首页iOS开发iOS开发实战iOS
iOS开发——WebView进度条

iOS开发——WebView进度条

作者: kuai空调 | 来源:发表于2016-05-10 17:53 被阅读5169次

    类似Safari的加载进度条,除了比HUD更加简洁,也有更好的用户体验。HUD会让用户觉得等待的时间很长,因为用户注意力集中在一个没有程度变化的东西上面。而进度条是有程度变化的,所以会让用户产生加载速度比HUD快的错觉。(本人在公司内调查,的确如此)。所以现在就行动吧!

    你可能已经注意到了,是WebView进度条而不是UIWebView,没错这个实现真对的不是UIWebView而是WKWebView,什么你不知道WKWebView?赶紧谷歌或者必应一下吧,这个控件要比UIWebView性能强大并且功能丰富,关于WKWebView的使用不属于本篇介绍的范围,感兴趣的可以自行搜索,后续我也会写相关的文章的。

    好,废话不多说,进入正题。WKWebView有一个属性estimatedProgress,就是当前网页加载的进度,所以首先监听这个属性。

    WKWebView *webView = [[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    self.webView = webView;
    

    接下来,就是弄一个进度条啦,在viewDidLoad方法里面写:

        UIView *progress = [[UIView alloc]initWithFrame:CGRectMake(0, 64, CGRectGetWidth(self.view.frame), 3)];
        progress.backgroundColor = [UIColor clearColor];
        [self.view addSubview:progress];
        
        CALayer *layer = [CALayer layer];
        layer.frame = CGRectMake(0, 0, 0, 3);
        layer.backgroundColor = COLOR_BAR_TIN.CGColor;
        [progress.layer addSublayer:layer];
        self.progresslayer = layer;
    

    为什么要用CALayer?隐式动画啊。然后就是监听方法啦

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
        if ([keyPath isEqualToString:@"estimatedProgress"]) {
            self.progresslayer.opacity = 1;
            //不要让进度条倒着走...有时候goback会出现这种情况
            if ([change[@"new"] floatValue] < [change[@"old"] floatValue]) {
                return;
            }
            self.progresslayer.frame = CGRectMake(0, 0, self.view.bounds.size.width * [change[@"new"] floatValue], 3);
            if ([change[@"new"] floatValue] == 1) {
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    self.progresslayer.opacity = 0;
                });
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    self.progresslayer.frame = CGRectMake(0, 0, 0, 3);
                });
            }
        }else{
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
    }
    

    拷贝到自己的项目里面就OK啦,是不是很爽呢?最后别忘了取消监听...

    - (void)dealloc{
        [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
    }
    

    拿过去给产品show,告诉他你各种深度优化,让网页加载提速了,他肯定会说,「牛逼!」。

    应大家要求,搞了个demo:
    https://github.com/timehzy/WebViewWithProgressLine

    相关文章

      网友评论

      • hhgvg:这个东西不要用代理的吗
        kuai空调:@hhgvg 那是另外的事情,不相干的
        hhgvg:那我和h5页面一起用呢 假如我要获取上面的js事件
        kuai空调:@hhgvg 不用
      • Ziruma:居然说谷歌或者必应,而不是百度,不爱国!哈哈哈
        kuai空调:@风兮起兮云飞翔 👍,当时做的时候对change的键名称想当然了,log一下果然没有。已经修改了,谢谢🙏
        Ziruma:@风兮起兮云飞翔 貌似change里面并没有old啊 :angry:
        kuai空调:@风兮起兮云飞翔 你是要像微软一样,此时此刻正在孵化着很多前沿的科学项目;像谷歌一样把“不作恶”写进自己的企业文化里;像苹果一样使用着100%的清洁能源;还是要像百度一样……给莆田系医院诈骗团伙做广告,被全世界唾弃

        ——fview
      • Idoahc:你好,我现在遇到了一个比较急的问题,就是找不到原因,现在我在做一个直播的app,其中接受弹幕评论是用的一个webView,现在问题是打开以后必须要滑动几次webView后才能实时接受评论,如果打开之后不懂webView就一直不显示评论,这个是什么原因呢?希望您抽空回复一下,多谢了
      • 烟雨痕:@飞烟灰灭 我按你写的delloc里面的取消监听, dealloc的时候会出现crash; 我用[self.webView removeObserver:self forKeyPath:@"estimatedProgress"]; 不会出现crash(测试过). 难道是因为当前控制器是子类的原因(我当前的控制器是集成一个父控制器). crash原因:<UIView 0x15e58690> because it is not registered as an observer.
        Chrisss:dealloc 里面最好不要写 self. , _webView removeObsever:xxx 才对
        Chrisss:@kuai空调 不要用 self.webView, dealloc 中最好还是使用 _webView
        kuai空调:@泽明先生 是我的疏忽,应该是self.webView,谢谢提醒
      • 小北风sky:正好项目中遇到了这种需求,照你的demo很快就搞定了,多谢了
      • 海边的1984_:给个demo逗比
        kuai空调:@小小流浪的汉子 快去star呀
      • 喵小帅:可以上传下demo么?
        kuai空调:@喵小帅 上传了 :smiley:
      • iOS开发工程师Echo:然后用了sb的,就并没有什么卵用
        kuai空调:@Fatm storyboard
        Fatm:@kuai空调 什么是sb,怎么用
        kuai空调:@Alan_Eternally 目前WKWebview并不能使用sb
      • 4c470893d66c:学习了
      • 2068e5e51f60:真棒!
      • 雷鸣1010:赶紧试试,哈哈

      本文标题:iOS开发——WebView进度条

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