iOS WKWebView显示加载进度条

作者: 点滴86 | 来源:发表于2017-05-04 14:27 被阅读333次

    WKWebView有如下属性,可以用KVO监听实现加载页面的进度条显示

    @property (nonatomic, readonly) double estimatedProgress;
    

    首页如下

    首页.png

    点击WKWebView加载进度条,效果如下

    百度页-1.png

    代码如下

    #import "ViewController.h"
    #import <WebKit/WebKit.h>
    
    @interface ViewController ()<WKNavigationDelegate>
    
    /** UI */
    @property (nonatomic, strong) UIProgressView *myProgressView;
    
    @property (nonatomic, strong) WKWebView *myWebView;
    
    @end
    
    @implementation ViewController
    
    #pragma mark - life cycle
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.title = @"WKWebView 加载进度条";
        self.view.backgroundColor = [UIColor whiteColor];
        
        [self.view addSubview:self.myWebView];
        self.myWebView.frame = self.view.bounds;
        [self.view addSubview:self.myProgressView];
        
        [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
    }
    
    // 记得取消监听
    - (void)dealloc
    {
        [self.myWebView removeObserver:self forKeyPath:@"estimatedProgress"];
    }
    
    #pragma mark - WKNavigationDelegate method
    // 如果不添加这个,那么wkwebview跳转不了AppStore
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
    {
        if ([webView.URL.absoluteString hasPrefix:@"https://itunes.apple.com"]) {
            [[UIApplication sharedApplication] openURL:navigationAction.request.URL];
            decisionHandler(WKNavigationActionPolicyCancel);
        }else {
            decisionHandler(WKNavigationActionPolicyAllow);
        }
    }
    
    #pragma mark - event response
    // 计算wkWebView进度条
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if (object == self.myWebView && [keyPath isEqualToString:@"estimatedProgress"]) {
            CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
            self.myProgressView.alpha = 1.0f;
            [self.myProgressView setProgress:newprogress animated:YES];
            if (newprogress >= 1.0f) {
                [UIView animateWithDuration:0.3f
                                      delay:0.3f
                                    options:UIViewAnimationOptionCurveEaseOut
                                 animations:^{
                                     self.myProgressView.alpha = 0.0f;
                                 }
                                 completion:^(BOOL finished) {
                                     [self.myProgressView setProgress:0 animated:NO];
                                 }];
            }
            
        } else {
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
    }
    
    #pragma mark - getter and setter
    - (UIProgressView *)myProgressView
    {
        if (_myProgressView == nil) {
            _myProgressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 65, [UIScreen mainScreen].bounds.size.width, 0)];
            _myProgressView.tintColor = [UIColor blueColor];
            _myProgressView.trackTintColor = [UIColor whiteColor];
        }
        
        return _myProgressView;
    }
    
    - (WKWebView *)myWebView
    {
        if(_myWebView == nil)
        {
            _myWebView = [[WKWebView alloc] initWithFrame:CGRectZero];
            _myWebView.navigationDelegate = self;
            _myWebView.opaque = NO;
            _myWebView.multipleTouchEnabled = YES;
            [_myWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
        }
        
        return _myWebView;
    }
    
    @end
    

    加载完成页面效果如下

    百度页-3.png

    WKWebView加载进度条显示就实现啦

    相关文章

      网友评论

        本文标题:iOS WKWebView显示加载进度条

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