美文网首页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: 求大神指点
  • dev9527001:为什么我的都是显示满进度条,没有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
    da4a40342393:@阿拉拉 delegate

本文标题:iOS 使用NJKWebViewProgress做webvie

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