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!)) }}