iOS WKWebView 获得title和加载进度

来源:互联网 发布:股票智能分析软件 编辑:程序博客网 时间:2024/05/21 10:13

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