1. 程式人生 > >載入webview進度條

載入webview進度條

繼續將原來的Objective-C改寫成Swift。專案中,webview幾乎是一個必不可少的控制元件,最起碼,免責宣告,註冊協議得用吧? 而使用的時候,要麼是要給webview新增載入框,要麼是使用進度條,來提醒使用者等待webview展示。載入框就不說了,MBP,相信很多人在使用,這裡說說載入進度條,在iOS8以後,WKWebview帶有的一個屬性,便是進度引數  estimatedProgress。 此篇,我們將使用此引數,來繪製進度條。程式碼如下: 

//
//  WKWebview_VC.swift
//  WebView進度條
//
//  Created by YLJ on 2017/6/21.
//  Copyright © 2017年 YLJ. All rights reserved.
//

import UIKit
import WebKit

class WKWebview_VC: UIViewController, WKUIDelegate, WKNavigationDelegate {

    lazy private var webview: WKWebView = {
        self.webview = WKWebView.init(frame: self.view.bounds)
        self.webview.uiDelegate = self
        self.webview.navigationDelegate = self
        return self.webview
    }()
    
    lazy private var progressView: UIProgressView = {
        self.progressView = UIProgressView.init(frame: CGRect(x: CGFloat(0), y: CGFloat(65), width: UIScreen.main.bounds.width, height: 2))
        self.progressView.tintColor = UIColor.green      // 進度條顏色
        self.progressView.trackTintColor = UIColor.white // 進度條背景色
        return self.progressView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(webview)
        view.addSubview(progressView)
        
        webview.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
        webview.load(URLRequest.init(url: URL.init(string: "https://www.baidu.com/")!))
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        if keyPath == "estimatedProgress"{
            progressView.alpha = 1.0
            progressView.setProgress(Float(webview.estimatedProgress), animated: true)
            if webview.estimatedProgress >= 1.0 {
                UIView.animate(withDuration: 0.3, delay: 0.1, options: .curveEaseOut, animations: {
                    self.progressView.alpha = 0
                }, completion: { (finish) in
                    self.progressView.setProgress(0.0, animated: false)
                })
            }
        }
    }
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("開始載入")
    }
    
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        print("開始獲取網頁內容")
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("載入完成")
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        print("載入失敗")
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow);
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    deinit {
        webview.removeObserver(self, forKeyPath: "estimatedProgress")
        webview.uiDelegate = nil
        webview.navigationDelegate = nil
    }
}