How to add Activity Indicator to WKWebView (Swift 3) How to add Activity Indicator to WKWebView (Swift 3) ios ios

How to add Activity Indicator to WKWebView (Swift 3)


Please, below code which is working fine.

@IBOutlet weak var Activity: UIActivityIndicatorView!var webView : WKWebView!@IBOutlet var containerView: UIView? = niloverride func viewDidLoad() {    super.viewDidLoad()        guard let url = URL(string: "http://www.facebook.com") else { return }    webView = WKWebView(frame: self.view.frame)    webView.translatesAutoresizingMaskIntoConstraints = false    webView.isUserInteractionEnabled = true    self.view.addSubview(self.webView)    let request = URLRequest(url: url)    webView.load(request)        // add activity    self.webView.addSubview(self.Activity)    self.Activity.startAnimating()    self.webView.navigationDelegate = self    self.Activity.hidesWhenStopped = true    }

Implement below these two delegate method:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {    Activity.stopAnimating()}func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {    Activity.stopAnimating()}

Let me know if it is not working.


import UIKitimport WebKitclass ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {    var webView: WKWebView!    var activityIndicator: UIActivityIndicatorView!    override func viewDidLoad() {        webView = WKWebView(frame: CGRect.zero)        webView.navigationDelegate = self        webView.uiDelegate = self        view.addSubview(webView)        activityIndicator = UIActivityIndicatorView()        activityIndicator.center = self.view.center        activityIndicator.hidesWhenStopped = true        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray        view.addSubview(activityIndicator)        webView.load(URLRequest(url: URL(string: "http://google.com")!))    }    func showActivityIndicator(show: Bool) {        if show {            activityIndicator.startAnimating()        } else {            activityIndicator.stopAnimating()        }    }    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {        showActivityIndicator(show: false)    }    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {        showActivityIndicator(show: true)    }    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {        showActivityIndicator(show: false)    }}


Swift 5 Version

The concept is simple enough to be ported to earlier swift versions.

This is a class we would use as a parent class anywhere we want a webview.

import UIKitimport WebKitclass CustomWebViewController: UIViewController, WKNavigationDelegate {    var activityIndicator: UIActivityIndicatorView!    override func viewDidLoad() {        super.viewDidLoad()        activityIndicator = UIActivityIndicatorView()        activityIndicator.center = self.view.center        activityIndicator.hidesWhenStopped = true        activityIndicator.style = .gray        activityIndicator.isHidden = true        view.addSubview(activityIndicator)    }    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {        activityIndicator.isHidden = false        activityIndicator.startAnimating()    }    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {        activityIndicator.stopAnimating()        activityIndicator.isHidden = true    }}

If we have a UIViewController with a webview, we can just inherit from CustomWebViewController and it will take care of the rest for us. Remember to connect the webview IBOutlet.

import UIKitimport WebKitclass FirstViewController: CustomWebViewController {    @IBOutlet var webView: WKWebView!    override func viewDidLoad() {        super.viewDidLoad()        webView.navigationDelegate = self        let url = URL(string: "https://google.com")        webView.load(URLRequest(url: url!))    }}