お久しぶりですポットです。
最近はiOSのアプリ開発に勤しんでいる毎日です。
さてブログの本題通りiOSのUIWebViewが思ったように動作しないので対応してみました。
UIWebViewの仕様が変わってしまったのかわかりませんが現象としては、UIWebViewでウェブページを表示する時にページの読み込み開始と終了時に呼び出されるwebViewDidStartLoadとwebViewDidFinishLoadというdelegateメソッドが複数回呼び出されてしまうということです。
インジケーターなどWebページの読み込み中を表示する制御をwebViewDidStartLoadとwebViewDidFinishLoadで普通にやっていると点滅しとても不安定に見えてしまいます。
どうやらiframeやredirect,javascriptの読み込みなどを行うとstartとfinishを繰り返してしまうようです。
delegateが何度も呼ばれるのはしかたがないので、カウンターをつけて対処しました。
//ページを読み込み開始時に呼ばれる
-(void)webViewDidStartLoad:(UIWebView*)webView{
NSLog(@"startLoadWeb");
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[SVProgressHUD show];
webViewLoads_++;
}
// ページ読込完了時にインジケータを非表示にする
-(void)webViewDidFinishLoad:(UIWebView*)webView{
webViewLoads_--;
NSLog(@"%d", webViewLoads_);
if ( webViewLoads_ <= 0 ) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[SVProgressHUD dismiss];
NSLog(@"endLoadWeb");
}
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
webViewLoads_--;
NSLog(@"error webView");
}
webViewLoads_でロードされた回数を記録して最後に0になればWebページが全部読み込まれたと判断してインジケーターを停止しています。
いつからこんな仕様になったんでしょうかね?
Appleわけわかめ…
他にもっといい方法がぜひぜひ教えていただきたいので知ってたら教えてくださいませ〜
