zoukankan      html  css  js  c++  java
  • NJKWebViewProgress ——webview进度条

    导入头文件
    #import "NJKWebViewProgressView.h"
    #import "NJKWebViewProgress.h"
    遵守协议
      <UIWebViewDelegate, NJKWebViewProgressDelegate>
    实现代码
    @implementation ViewController
    {
        IBOutlet __weak UIWebView *_webView;
        NJKWebViewProgressView *_webViewProgressView;
        NJKWebViewProgress *_webViewProgress;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        _webViewProgress = [[NJKWebViewProgress alloc] init];
        _webView.delegate = _webViewProgress;
        _webViewProgress.webViewProxyDelegate = self;
        _webViewProgress.progressDelegate = self;
    
    
    CGRect navBounds = self.navigationController.navigationBar.bounds;
    CGRect barFrame = CGRectMake(0,
                                 navBounds.size.height - 2,
                                 navBounds.size.width,
                                 2);
    _webViewProgressView = [[NJKWebViewProgressView alloc] initWithFrame:barFrame];
    _webViewProgressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
    [_webViewProgressView setProgress:0 animated:YES];
    [self loadBaidu];
    [self.navigationController.navigationBar addSubview:_webViewProgressView];
    }
    
    -(void)loadBidu
    {
        NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
        [_webView loadRequest:req];
    }
    
    #pragma mark - NJKWebViewProgressDelegate
    -(void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress
    {
        [_webViewProgressView setProgress:progress animated:YES];
        self.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    }

    NJKWebViewProgress是怎么做到的,分析如下:

    • webViewDidStartLoad 是一个请求的开始,所有的请求都要经过它,未加载资源之前,能够得到一个URL 有多少个资源需要加载,使用_loadingCount++ 方式来计数。
    • webViewDidFinishLoaddidFailLoadWithError 是一个请求的结束,每次请求结束 _loadingCount --,并重新计数进度
    • 进度使用 _loadingCount/_maxLoadCount 的方式来计算
    • 每次webViewDidFinishLoaddidFailLoadWithError 请求都加入了 waitForCompleteJS 这样的js到web view中,来检测网页是否加载完成。
      • 把得到进度逻辑和展示进度的视图分开写,用代理把两个类联系起来,结构清晰、实现起来也会方便很多
  • 相关阅读:
    在web项目启动时,使用监听器来执行某个方法
    spring boot --- 初级体验
    Java字符串连接最佳实践
    JPA
    基于Spring AOP的JDK动态代理和CGLIB代理
    jQuery.validate表单校验+bootstrap
    搜索技术---solr
    最常用的缓存技术---redis入门
    内外网同时访问的路由配置
    创建 Visual Studio 2017 离线安装
  • 原文地址:https://www.cnblogs.com/sungk/p/5075832.html
Copyright © 2011-2022 走看看