WkWebViewを使用してHTMLページをロードし、ロードが完了した直後にページを表示したい。読み込み中であれば、空のビューにアクティビティインジケーターを表示したいと思います。 loadingViewとwkWebViewの2つのビューを作成します。ページの読み込み中に、loadViewのサブビューとしてVCに追加し、loadingViewを削除してwkWebViewを追加したい場合、次のコードを使用します。
[self addSubview:_loadingView];
_wkWebView = [[WKWebView alloc] initWithFrame:self.frame];
_wkWebView.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, self.frame.size.width, self.frame.size.height);
//Send a request to wkUrlconnection
NSURL *wkUrl = [NSURL URLWithString:self.wkUrlString];
NSURLRequest *wkRequest = [NSURLRequest requestWithURL:wkUrl];
//Here I want to check if it's loaded and then remove loadingView and add wkWebView
[_wkWebView loadRequest:wkRequest];
[self.loadingView removeFromSuperview];
[self addSubview:_wkWebView];
読み込み中に確認する方法を教えてもらえますか。VCの更新が完了したら、教えてください。ご回答ありがとうございます。
WKNavigationDelegate
の- webView:didFinishNavigation: デリゲートコールバックが探しているものだと思います。
コールバックが呼び出されたときに、ロードを開始するときにアクティビティインジケーターを構成して表示し、その後、表示から停止して削除します。
for Swift 4.2:
func webView(_ webView: WKWebView,
didFinish navigation: WKNavigation!){
print("loaded")
}
didLoad(または同様の)でwebViewのデリゲートを設定してください
webView.navigationDelegate = self
複数のフレームを含むWebページの問題を経験しているため、ロードアニメーションを中断する複数のロードを実行している人のために、以下を実装しました。これまでに遭遇したすべての状況で動作します。
Swift 4.2:
var loadCount = 0
override func viewDidLoad() {
super.viewDidLoad()
startLoading()
webview.navigationDelegate = self
let request = URLRequest(url: url)
webview.load(request)
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
loadCount += 1
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
loadCount -= 1
DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
if (self.loadCount == 0) {
self.stopLoading()
}
}
}
基本的な考え方は、URLをリクエストする前にロードアニメーションを開始し、作成されている各リクエストをカウントし、リクエストカウント== 0の場合にのみロードアニメーションを停止することです。 0.1秒の遅延が完了する前に次のロードが開始されるように同期的に要求します。
(͡°͜ʖ͡°)