美文网首页iOS移动开发带我飞ios学习资料
iOS 使用NJKWebViewProgress做webvie

iOS 使用NJKWebViewProgress做webvie

作者: X先生_vip | 来源:发表于2015-05-26 14:40 被阅读22277次

    NJKWebViewProgress地址:https://github.com/ninjinkun/NJKWebViewProgress

    导入头文件
    #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"];
    }

    相关文章

      网友评论

      • 8f858a1c85d1:第一步创建
        // 若无导航栏,64.0 改为 0.0
        self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0.0, 64.0, self.view.frame.size.width, 1)];
        [self.view addSubview:self.progressView];

        第二步:添加监听事件
        - (void)viewDidLoad{
        [self.webView addObserver:self
        forKeyPath:@"loading"
        options:NSKeyValueObservingOptionNew
        context:nil];
        }

        第三步:不用时隐藏
        #pragma mark - KVO
        - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
        if ([keyPath isEqualToString:@"loading"]) {
        self.progressView.hidden = NO;
        }
        if (!self.webView.loading) {
        [UIView animateWithDuration:0.5
        animations:^{
        self.progressView.hidden = YES;
        } completion:nil];
        }
        }
      • _小地鼠:不好用这个
        d6639d5048ed:有没有什么好用的啊?给推荐一个啊
      • 多LV信源:这个demo有个明显的bug, 先会显示整个进度完成(100%), 然后再一点点进度从0开始网上加载, 这个怎么解决?
        _小地鼠:这个不太好用
        多LV信源:@青楼 已解决
        X先生_vip:@多LV信源 创建的时候赋值为0
      • 巴图鲁:膜拜
      • 在没老之前:每次进度条都停在左边一小部分,然后就不动了。知道界面完全加载完毕,才消失。根本不能跟着进度来变长 啊
        若小北00:@在没老之前 有办法解决没?
        在没老之前:@颖儿life 我感觉是加载一些https的网页。它进行了重定向,导致这个进度条并不能跟着进度来变化。。。。但是解决方案没想到。。。。
        颖儿life:@在没老之前 我也遇到同样的问题,不知道你解决没有呢,期待回复
      • 风茗夜雨:有时进度0.5 有时进度1 ,楼主怎么解决的,手动又是如何解决的
      • 搬砖快乐: :scream: 直接不显示 :sweat: 求大神指点
      • 简述简述简书:为什么我的都是显示满进度条,没有demo那样从0开始增加到满状态的样子.
      • ecfb918e5ccf:求大神给8楼解释一下。就是我上边的问题。
      • ecfb918e5ccf:能给解释一下吗?这个github上,貌似是一个日本朋友写的。不会日语,不好问他。
      • ecfb918e5ccf:您好:这里边有一段代码我不太明白他的意思。当一次发生交互的时候执行了:
        NSString *waitForCompleteJS = [NSString stringWithFormat:@"window.addEventListener('load',function() { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = '%@://%@%@'; document.body.appendChild(iframe); }, false);", webView.request.mainDocumentURL.scheme, webView.request.mainDocumentURL.host, completeRPCURLPath];
        [webView stringByEvaluatingJavaScriptFromString:waitForCompleteJS];
        但是在shouldStartLoadWithRequest方法中,他又做了:
        if ([request.URL.path isEqualToString:completeRPCURLPath]) {
        [self completeProgress];
        return NO;
        }
        这样一个操作。很显然上面的js之行,这个shouldStartLoadWithRequest 就会return NO。
        这样写的目的是什么?还有completeRPCURLPath 这个path的意义是什么?
        ecfb918e5ccf:@青楼
        - (void)webViewDidFinishLoad:(UIWebView *)webView
        {
        if ([_webViewProxyDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
        [_webViewProxyDelegate webViewDidFinishLoad:webView];
        }

        _loadingCount--;
        [self incrementProgress];

        NSString *readyState = [webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];

        BOOL interactive = [readyState isEqualToString:@"interactive"];
        if (interactive) {
        _interactive = YES;
        NSString *waitForCompleteJS = [NSString stringWithFormat:@"window.addEventListener('load',function() { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = '%@://%@%@'; document.body.appendChild(iframe); }, false);", webView.request.mainDocumentURL.scheme, webView.request.mainDocumentURL.host, completeRPCURLPath];
        [webView stringByEvaluatingJavaScriptFromString:waitForCompleteJS];
        }

        BOOL isNotRedirect = _currentURL && [_currentURL isEqual:webView.request.mainDocumentURL];
        BOOL complete = [readyState isEqualToString:@"complete"];
        if (complete && isNotRedirect) {
        [self completeProgress];
        }
        }
        这个里边执行了:waitForCompleteJS 这个js。那么shouldStartLoadWithRequest这个方法里办就会执行 if ([request.URL.path isEqualToString:completeRPCURLPath]) {
        [self completeProgress];
        return NO;
        }
        这个逻辑。但是不知道他的功能
        ecfb918e5ccf:@青楼 这个就是他的那个 NJKWebViewProgress里边的逻辑。我把完整的贴出来吧。
        X先生_vip:@蚂蚁先森_C 这没有上下文我也不清楚具体要实现什么功能
      • 起个啥名字呢:-(void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress
        {
        [self.progressView setProgress:progress animated:YES];
        }
        我在这个方法中,progress 值有时候是0.5,但是网页明明加载完了,怎么破
        devmao://在webview加载失败的方法里将process置为1即可
        - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
        [_webViewProgressView setProgress:1 animated:YES];

        }
        起个啥名字呢:@青楼 恩 我试试,会不会 又其他bug 谢谢
        X先生_vip:@起个啥名字呢 加载完成后可以手动置1
      • 998e4a3fbbdc:真机时即使退出webView左侧一直有一小块进度条 怎么破
        998e4a3fbbdc:@在没老之前 你在 返回到主界面的时候移除一下这个进度条就行了 进度条是加载 navBar上面的
        在没老之前:怎么是释放啊?我直接让_webPrgress= nil;貌似不行。。。。而且再次点击网页,那个进度条一直卡在那
        起个啥名字呢:@雷大腚 没有释放
      • bear铜扣:能改变进度条颜色吗?
        溜了12315:现在只需要改NJKWebViewProgressView里的progressBarView的backgroundColor就可以更改进度条颜色了
        菜鸟吃咸鱼:@bear铜扣 可以,在progressview那个文件夹下,NJKWebViewProgressView.m文件下的-(void)configureViews函数下 UIColor *tintColor = [UIColor colorWithRed:255.f / 255.f green:64.f / 255.f blue:64.f / 255.f alpha:1.0]; // iOS7 Safari bar color
        这个就是进度条的颜色,上面的是我改为红色的颜色。
      • 贪吃鱼:这个demo都用不了 不好用
      • 阿拉拉:为什么用了这个进度条我的WebViewJavascriptBridge,点击交互跳转,点击就没有用了
        代码干货:@阿拉拉 你解决了没
        农民工ryan:@阿拉拉 WebViewJavascriptBridge 和这个貌似只能用一个,因为它们互相抢夺webview的delegate
        冖o冖:@阿拉拉 delegate

      本文标题:iOS 使用NJKWebViewProgress做webvie

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