之前我写过一个用于实现webview的简单进度条,文章地址:http://blog.csdn.net/flytosky_l/article/details/61915771
我在之前的文章中也翻译过苹果官方文档关于WKWebView的基本使用,文章地址:http://blog.csdn.net/flytosky_l/article/details/61924081
这里我参考网上代码和自己的实践,使用WKWebView加载网页是,进度条的展示,有疏漏错误,欢迎指出。
对于WKWebView,它支持苹果8.0以及更高版本,所以需要兼容8.0以下版本的应用,不建议使用。之前我的一篇文章,使用UIWebView加载进度条,实际只是一个虚拟展示的进度条,同样可以在WKWebView加载网页时使用,但是这里使用的进度条展示,则不再适用于UIWebView,从这里看,貌似WKWebView似乎更为强大,其实从苹果的官方文档中对比UIWebView和WKWebView,你应该同样有这样的感觉吧(这个只是我个人观点)。
代码示例:(使用xcode7.3 swift2.2)
//
import UIKit
import WebKit
class WKWebViewController: UIViewController , WKUIDelegate {
var webView : WKWebView?
var urlString = "https://www.apple.com"
var progressBar : UIProgressView?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.grayColor()
let rect = UIScreen.mainScreen().bounds
let webConfiguratiojn = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguratiojn)//初始化
webView!.frame = CGRectMake(0.0, 0.0, rect.width, rect.height)
webView!.backgroundColor = UIColor.whiteColor()//设置背景颜色
self.view.addSubview(webView!)//添加到View
progressBar = UIProgressView()//进度条控件初始化
progressBar!.frame = CGRectMake(0.0, 64.0, rect.width, 2)
view.addSubview(progressBar!)//添加到View
webView!.UIDelegate = self//设置WKWebView控件的代理
let request = NSURLRequest.init(URL: NSURL.init(string: urlString)!)
webView!.loadRequest(request)//加载网络
webView!.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.New, context: nil)//添加观察者
}
//观察者的监听
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "title" {//如果加载完成,keypath值为标题时,设置界面的标题
self.title = self.webView!.title
} else if keyPath == "estimatedProgress" {//如果为添加的观察者,设置进度条的加载进度 estimatedProgress是苹果提供给开发者的网页加载的进度
self.progressBar!.progress = Float(self.webView!.estimatedProgress)
}
if object?.isKindOfClass(WKWebView) == true && keyPath! == "estimatedProgress" {//判断观察者为WKWebView时,监听keypath为之前的添加estimatedProgress
// var newprogress = change?.indexForKey(NSKeyValueChangeNewKey)//这个是获取进度的一种方式
let newprogress = Float((self.webView?.estimatedProgress)!)//获取WKWebView的加载进度
if newprogress == 1.0 {//加载完成,隐藏进度条,并将其回复到加载进度的初始值
self.progressBar!.hidden = true
self.progressBar!.setProgress(0.0, animated: false)
}else{//未完成,随时改变加载的进度
self.progressBar!.hidden = false
self.progressBar!.setProgress(0.5, animated: true)
}
}
}
//内存和性能的管理,在界面销毁时,需要注销添加的观察者
deinit {
webView?.removeObserver(self, forKeyPath: "estimatedProgress")
}
}
源码地址: