分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

一个KVO 实现WKWebView加载进度条的例子 (注意最后移除观察者)

发布时间:2023-09-06 02:13责任编辑:沈小雨关键词:Web
//// ?OpenWebViewController.m// ?Treasure//// ?Created by 蓝蓝色信子 on 16/7/29.// ?Copyright ? 2016年 GY. All rights reserved.//#import "ZTOpenWebViewController.h"#import <WebKit/WebKit.h>@interface ZTOpenWebViewController ()<WKNavigationDelegate>//{// ???//网页视图// ???UIWebView * _webView;//}@property (strong, nonatomic) WKWebView *webView;@property (strong, nonatomic) UIProgressView *progressView;@end@implementation ZTOpenWebViewController- (void)viewDidLoad { ???[super viewDidLoad]; ???// ???//取消导航栏的影响 ???self.automaticallyAdjustsScrollViewInsets = NO; ???self.view.backgroundColor = [UIColor whiteColor]; ???????//[SVProgressHUD show]; ???//实例化 ???[self createWebView]; ???????[self creatCustomProgressView];}-(void)creatCustomProgressView{ ???????//增加加载进度条 ???// KVO,监听webView属性值得变化(estimatedProgress,title为特定的key) ???[_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; ???[_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil]; ???????// UIProgressView初始化 ???self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; ???self.progressView.frame = CGRectMake(0, 0, _webView.frame.size.width, 5); ???self.progressView.trackTintColor = [UIColor clearColor]; // 设置进度条的色彩 ???self.progressView.progressTintColor = [UIColor magentaColor]; ???// 设置初始的进度,防止用户进来就懵逼了(微信大概也是一开始设置的10%的默认值) ???[self.progressView setProgress:0.1 animated:YES]; ???[_webView addSubview:self.progressView];}- (void)viewWillAppear:(BOOL)animated{ ???[self.navigationController setNavigationBarHidden:NO animated:NO]; ???[super viewWillAppear:YES];}- (void)viewWillDisappear:(BOOL)animated{ ???[SVProgressHUD dismiss]; ???[super viewWillDisappear:animated];}- (void)createWebView{ ???_webView = [[WKWebView alloc]initWithFrame:self.view.bounds]; ???????[self.view addSubview:_webView]; ???????//调整适应比例 ???//_webView.scalesPageToFit = YES; ???//设置代理 ???_webView.navigationDelegate = self; ???[[NSURLCache sharedURLCache] removeAllCachedResponses]; ???[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlStr] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0]]; ???}#pragma mark - WKWebView NavigationDelegate//WKNavigationDelegate- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { ???//NSLog(@"是否允许这个导航"); ???decisionHandler(WKNavigationActionPolicyAllow);}- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { ???// ???Decides whether to allow or cancel a navigation after its response is known. ???????//NSLog(@"知道返回内容之后,是否允许加载,允许加载"); ???decisionHandler(WKNavigationResponsePolicyAllow);}- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation { ???//NSLog(@"开始加载"); ???//self.progress.alpha ?= 1; ???????//[SVProgressHUD show]; ???[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; ???}- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation { ???//NSLog(@"跳转到其他的服务器"); ???}- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error { ???//NSLog(@"网页由于某些原因加载失败"); ???//[SVProgressHUD dismiss]; ???//self.progress.alpha ?= 0; ???[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;}- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation { ???//NSLog(@"网页开始接收网页内容");}- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation { ???//NSLog(@"网页导航加载完毕"); ???//[SVProgressHUD dismiss]; ???[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; ???????self.title = webView.title; ???[webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable ss, NSError * _Nullable error) { ???????//NSLog(@"----document.title:%@---webView title:%@",ss,webView.title); ???}]; ???//self.progress.alpha ?= 0; ???}- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error { ???//NSLog(@"加载失败,失败原因:%@",[error description]); ???//self.progress.alpha = 0;}- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView { ???//NSLog(@"网页加载内容进程终止");}#pragma mark - KVO监听// 第三部:完成监听方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { ???????if ([object isEqual:_webView] && [keyPath isEqualToString:@"estimatedProgress"]) { // 进度条 ???????????????CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue]; ???????//NSLog(@"打印测试进度值:%f", newprogress); ???????????????if (newprogress == 1) { // 加载完成 ???????????// 首先加载到头 ???????????[self.progressView setProgress:newprogress animated:YES]; ???????????// 之后0.3秒延迟隐藏 ???????????__weak typeof(self) weakSelf = self; ???????????dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ ???????????????????????????????weakSelf.progressView.hidden = YES; ???????????????[weakSelf.progressView setProgress:0 animated:NO]; ???????????}); ???????????????????} else { // 加载中 ???????????self.progressView.hidden = NO; ???????????[self.progressView setProgress:newprogress animated:YES]; ???????} ???} else if ([object isEqual:_webView] && [keyPath isEqualToString:@"title"]) { // 标题 ???????????????//self.title = _webView.title; ???} else { // 其他 ???????????????[super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; ???}}-(void)dealloc{ ???NSLog(@"webVC dealloc = %@",self); ???[_webView removeObserver:self forKeyPath:@"estimatedProgress"]; ???[_webView removeObserver:self forKeyPath:@"title"];}- (void)didReceiveMemoryWarning { ???[super didReceiveMemoryWarning]; ???// Dispose of any resources that can be recreated.}/* #pragma mark - Navigation ?// In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */@end

一个KVO 实现WKWebView加载进度条的例子 (注意最后移除观察者)

原文地址:https://www.cnblogs.com/liuw-flexi/p/9593716.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved