WebViewベースの画面で作業しています。ウェブコンテンツの読み込み中に回転するアクティビティインジケータが必要です。iOS Swift - 複数のアクティビティインジケータ(スピナー)がウェブビューに表示されます
私はアプリの別の画面で同じアクティビティインジケータを使用する必要があるので、コードを静的関数に特定のファイルに入れました。
アクティビティインジケータは、一部のWeb(シンプルな)Webページで正常に動作しているようですが、より複雑なページを読み込むと問題が発生します。 アクティビティインジケータが何度も重複して表示されます。スクリーンショットで
(下のスクリーンショットを参照)、最初のアクティビティインジケータが正しいレイアウトを有するが、以下の一つは、いくつかの他のアクティビティインジケータは、互いの上にオーバーレイされていることを意味する暗いです。 そして、彼らは決して消えません。
それがコードに来るとき:
私は活動の指標を制御するのWebViewと2つのデリゲートメソッドを持っています。
func webViewDidStartLoad(_ webView: UIWebView) {
DispatchQueue.main.async {
EBUtil.startActivityIndicator(self)
}
}
func webViewDidFinishLoad(_ webView: UIWebView) {
DispatchQueue.main.async {
EBUtil.stopActivityIndicator(self)
}
}
私は、webViewDidStartLoadが何度か呼び出されていると思います。どのように私はこの動作が発生するのを防ぐことができますか?
ありがとうございます。
エドゥアール
編集:ここでは
は私のVCのための完全なコードです。
class NewsDetailsViewController: UIViewController, UIWebViewDelegate {
//MARK: - @IBOUTLETS
@IBOutlet weak var webView: UIWebView!
//MARK: - VARIABLES
var url: String!
//MARK: - APP LIFE CYCLE
override func viewDidLoad() {
super.viewDidLoad()
if url != nil {
let urlToLoad = NSURL(string: url)
webView.loadRequest(NSURLRequest(url: urlToLoad as! URL) as URLRequest)
}
}
func webViewDidStartLoad(_ webView: UIWebView) {
DispatchQueue.main.async {
EBUtil.startActivityIndicator(self)
}
}
func webViewDidFinishLoad(_ webView: UIWebView) {
DispatchQueue.main.async {
EBUtil.stopActivityIndicator(self)
}
}
}
そして活動の指標のためのコードの起動と停止:
static func startActivityIndicator(_ sender: UIViewController) {
print("START ANIMATING")
if let view = sender.view {
activityIndicatorBackground = UIView(frame: CGRect(x: view.center.x - 25, y: view.center.y - 25, width: 50, height: 50))
activityIndicatorBackground.backgroundColor = UIColor.black
activityIndicatorBackground.layer.zPosition = CGFloat(MAXFLOAT-1)
activityIndicatorBackground.alpha = 0.6
activityIndicatorBackground.layer.cornerRadius = 5
view.addSubview(activityIndicatorBackground)
activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
activityIndicator.center = view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white
activityIndicator.layer.zPosition = CGFloat(MAXFLOAT)
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
UIApplication.shared.beginIgnoringInteractionEvents()
}
}
static func stopActivityIndicator(_ sender: UIViewController) {
print("STOP ANIMATING")
activityIndicatorBackground.removeFromSuperview()
activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
}
シェア完全なコード.. –
あなたはどのようにあなたがあなたの画面にあなたのWebViewを追加する共有する(すなわちbelow-のようなあなたの
startActivityIndicator
stopActivityIndicator
方法は、ルートビュー)? – tropicalfishあなたはそのコードを呼び出すたびに新しいインジケータを作成しています。ブールで再度呼び出された場合は現在のコードを削除してください。クラス機能ではなくシングルトンクラスで同じインスタンスを使用してください。 – Tj3n