2017-02-13 21 views
0

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が何度か呼び出されていると思います。どのように私はこの動作が発生するのを防ぐことができますか?

ありがとうございます。

エドゥアール

enter image description here

編集:ここでは

は私の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() 
} 
+0

シェア完全なコード.. –

+0

あなたはどのようにあなたがあなたの画面にあなたのWebViewを追加する共有する(すなわちbelow-のようなあなたのstartActivityIndicatorstopActivityIndicator方法は、ルートビュー)? – tropicalfish

+0

あなたはそのコードを呼び出すたびに新しいインジケータを作成しています。ブールで再度呼び出された場合は現在のコードを削除してください。クラス機能ではなくシングルトンクラスで同じインスタンスを使用してください。 – Tj3n

答えて

0

はこれを試す -

あなたのViewControllerクラスで線の下に追加 -

var activityIndicator: UIActivityIndicatorView? 

をとupdat電子

func startActivityIndicator(_ sender: UIViewController) { 

    print("START ANIMATING") 

    if let view = sender.view { 
     if activityIndicator != nil { 
      activityIndicator?.removeFromSuperview() 
     } 
     activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
     activityIndicator?.center = view.center 
     activityIndicator?.layer.cornerRadius = 10 
     activityIndicator?.backgroundColor = UIColor.gray 
     activityIndicator?.hidesWhenStopped = true 
     activityIndicator?.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white 
     activityIndicator?.layer.zPosition = CGFloat(MAXFLOAT) 
     view.addSubview(activityIndicator!) 
     activityIndicator?.startAnimating() 
     UIApplication.shared.beginIgnoringInteractionEvents() 
    } 
} 


func stopActivityIndicator(_ sender: UIViewController) { 
    print("STOP ANIMATING") 
    activityIndicator?.stopAnimating() 
    activityIndicator?.removeFromSuperview() 
    UIApplication.shared.endIgnoringInteractionEvents() 
} 

が、それはあなたのために働くことを願っています:)

このビューコントローラの
関連する問題