iOS WKWebView显示加载进度条
2017-05-04 本文已影响333人
点滴86
WKWebView有如下属性,可以用KVO监听实现加载页面的进度条显示
@property (nonatomic, readonly) double estimatedProgress;
首页如下

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

代码如下
#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
加载完成页面效果如下

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