UIWebView で urlrequest をロードしているアプリケーションを開発していますが、正常に実行されました。
しかし今、ロードが進行中 (0.0 から 1.0 まで) に UIProgressView を表示しようとしています。これは、ロードの進行とともに動的に変更されます。
どうやってやるの?
UIWebView で urlrequest をロードしているアプリケーションを開発していますが、正常に実行されました。
しかし今、ロードが進行中 (0.0 から 1.0 まで) に UIProgressView を表示しようとしています。これは、ロードの進行とともに動的に変更されます。
どうやってやるの?
UIWebView は、通常モードでは進捗情報を提供しません。まず、NSURLConnection を使用してデータを非同期に取得する必要があります。NSURLConnection デリゲート メソッドconnection:didReceiveResponseの場合、取得した数値をexpectedContentLength最大値として使用します。次に、デリゲート メソッド内で、NSData インスタンスconnection:didReceiveDataのプロパティを使用してlength、進行状況を伝えます。したがって、進行状況の割合はlength / maxLength、0.0 から 1.0 の間で正規化されます。
connection:didFinishLoading最後に、(デリゲート メソッドで) URL の代わりにデータを使用して webview を初期化します。
2 つの注意事項:
expectedContentLengthNSURLResponse のプロパティが-1 (NSURLReponseUnknownLength定数)になる可能性があります。その場合、内部で遮断する標準の UIActivityIndicator をスローすることをお勧めしますconnection:didFinishLoading。
NSURLConnection デリゲート メソッドの 1 つから可視コントロールを操作するときはいつでも、必ず呼び出して操作してくださいperformSelectorOnMainThread:。そうしないと、恐ろしい EXC_BAD_ACCESS エラーが発生し始めます。
この手法を使用すると、取得するデータ量がわかっている場合はプログレス バーを表示し、不明な場合はスピナーを表示できます。
プライベート UIWebView メソッドを使用する UIWebView のこのサブクラスの使用を試みることができます。したがって、このソリューションは 100% AppStore で安全ではありません (一部のアプリではほぼ 100% 使用されますが、Facebook、Google アプリなど)。