展示网页一直不是之前开发的重点,所以之前一直在用UIWebView展示网页,这周打算对项目中的网页展示部分做一次优化。
首先使用WKWebView取代UIWebView,其实WKWebView在iOS8就已经公布了,其性能比UIWebView提高许多,CPU使用降低,2d和3d的表现都明显增强等优点,网上找了一些比较文章。
简单的使用WKWebView
一些基本定义
import WebKit
//因为SB中没有可用的空间,所以只能代码添加
var webView = WKWebView()
在ViewDidLoad中定义大小并加入到自定义个containerView中
self.webView.frame = CGRect(x:0, y: 0, width: view.frame.width, height: view.frame.height - 66)
self.containerView.addSubview(webView)
打开URL
let url = NSURL(string:"http://www.jellytech.com.au")
let request = NSURLRequest(URL:url!)
webView.loadRequest(request)
完成以上内容,基本上已经可以打开一个网页了
Delegate方法
extension WebViewController: WKNavigationDelegate{
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("didStartProvisionalNavigation")
}
func webView(webView: WKWebView, didCommitNavigation navigation: WKNavigation!) {
print("didCommitNavigation")
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("didFinishNavigation")
}
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
print("didFailProvisionalNavigation")
}
func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation!, withError error: NSError) {
print("didFailNavigation")
}
}
第二部分是添加 一个简单的Progressbar
先在SB里定义了一个ProgressView
@IBOutlet weak var progressView: UIProgressView!
ViewDidLoad中,可以考虑放在containerView的下面
//替换self.containerView.addSubview(webView)
self.containerView.insertSubview(webView, belowSubview: progressView)
//ViewDidLoad中,添加一个KVO
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)
重载方法,网上有许多不同的进度条值的写法,这个算最简单的
//swift 2.2
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer) {
if (keyPath == "estimatedProgress") {
progressView.hidden = webView.estimatedProgress == 1
progressView.setProgress(Float(webView.estimatedProgress), animated: true)
}
}
最后重点中的重点,特别是对于新手而言,是大部分教程里没有提到的部分,就是离开这个页面的时候请记得移除observer,不然系统会报错!!!
override func viewWillDisappear(animated: Bool) {
webView.removeObserver(self, forKeyPath: "estimatedProgress")
super.viewWillDisappear(true)
}
结尾
突然感到有时间应该整理一下KVO的相关知识。
补充
当从webview界面返回上一页面时,系统奔溃,并且提示添加malloc_error_break(添加方法)。之前在使用UIWebView时,同样的写法并没有出现这个问题。
经过检查发现是因为“使用UIScrollViewDelegate”引起的。但是即使添加了malloc_error_break,因为apple给的说明几乎没用,所以在网上继续搜索一番,发现了一个解决方法, 在deinit中把scrollview的delegate清空。
deinit {
webView.scrollView.delegate = nil
}
终于不报错了...