iOS WKWebView 获得title和加载进度

作者: calary | 来源:发表于2017-12-14 14:57 被阅读30次

    1、前言

    iOS8后,苹果推出了新框架Webkit,提供了替换UIWebView的组件WKWebView,相比于UIWebView,好处多多,速度更快了,占用内存少了。

    2、基本使用

    使用方法和UIWebView大同小异,具体使用可以参考使用WKWebView替换UIWebView,这篇文章讲的挺详细了,这不是我们本篇的重点,我们的重点是讲下怎么页面title和加载进度值。

    3、获得页面title和加载进度值(基于系统KVO)

    //导入框架
    #import <WebKit/WebKit.h>
    /*********/
    @property (nonatomic, strong) WKWebView *mWebView;//webView
    @property (nonatomic, strong) UIProgressView *mProgressView;//进度条
    /*********/
    - (void)viewDidLoad {
      [super viewDidLoad];
      [self initWebView];
    }
      //增加kvo监听,获得页面title和加载进度值
    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        [self.mWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL];
        [self.mWebView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
    }
    //KVO 一定要移除,要不然会崩溃
    - (void)dealloc{
        [self.mWebView removeObserver:self forKeyPath:@"estimatedProgress"];
        [self.mWebView removeObserver:self forKeyPath:@"title"];
    }
    
    - (void)initWebView
    {
        _mWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight - TopFullHeight)];
        [_mWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http:xxxxx"]]];
        [self.view addSubview:_mWebView];
        
        //进度条添加到navigationBar
        CGFloat progressBarHeight = 2.0f;
        CGRect navigationBarBounds = self.navigationController.navigationBar.bounds;
        CGRect barFrame = CGRectMake(0, navigationBarBounds.size.height - progressBarHeight, navigationBarBounds.size.width, progressBarHeight);
        _mProgressView = [[UIProgressView alloc] initWithFrame:barFrame];
        _mProgressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
        _mProgressView.progressTintColor = [UIColor greenColor];
        [self.navigationController.navigationBar addSubview:_mProgressView];
    }
    
    #pragma mark KVO的监听代理
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
        //加载进度值
        if ([keyPath isEqualToString:@"estimatedProgress"]){
            if (object == self.mWebView){
                self.mProgressView.alpha = 1;
                [self.mProgressView setProgress:self.mWebView.estimatedProgress animated:YES];
                if(self.mWebView.estimatedProgress >= 1.0f)
                {
                    [UIView animateWithDuration:0.5 animations:^{
                        self.mProgressView.alpha = 0;
                    } completion:^(BOOL finished) {
                         [self.mProgressView setProgress:0.0f animated:NO];
                    }];
                }
            }else{
                [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
            }
        }else if ([keyPath isEqualToString:@"title"]){//网页title
            if (object == self.mWebView){
                self.navigationItem.title = self.mWebView.title;
            }else{
                [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
            }
        }else{
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
    }
    
    

    至此,加载标题和进度值完成,try。

    4、基于 KVOController

    KVOController是facebook开源的一个KVO框架,使用方便,好处多多,我就是因为侧滑返回偶尔导致系统KVO没有释放,最后程序崩溃了,所以这里建议使用这个框架,使用代码入下

    #import "FBKVOController.h"
    @property (nonatomic, strong) FBKVOController *kvoController;
    
    - (void)initFBKVO{
        
        //KVO
        __weak typeof (self) weakSelf = self;
        self.kvoController = [FBKVOController controllerWithObserver:self];
        [self.kvoController observe:self.mWebView keyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
            
            weakSelf.mProgressView.alpha = 1;
            [weakSelf.mProgressView setProgress:self.mWebView.estimatedProgress animated:YES];
            if(weakSelf.mWebView.estimatedProgress >= 1.0f)
            {
                [UIView animateWithDuration:0.5 animations:^{
                    weakSelf.mProgressView.alpha = 0;
                } completion:^(BOOL finished) {
                    [weakSelf.mProgressView setProgress:0.0f animated:NO];
                }];
            }  
        }];
        
        [self.kvoController observe:self.mWebView keyPath:@"title" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
             weakSelf.navigationItem.title = self.mWebView.title;
        }];
    }
    

    参考

    http://www.jianshu.com/p/6f2d733502c6
    http://blog.csdn.net/reylen/article/details/46679895

    相关文章

      网友评论

        本文标题:iOS WKWebView 获得title和加载进度

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