2017-02-13 58 views
0

我正在開發一個基於webView的屏幕,並且我想要在Web內容加載時有一個活動指示器來旋轉。iOS Swift - webview中出現多個活動指示器(紡紗器)

由於我必須在應用程序的另一個屏幕中使用相同的活動指示器,因此我已將靜態函數中的代碼放在特定文件中。

活動指示器似乎對一些網頁(簡單)網頁正常工作,但當我加載更復雜的頁面時,我遇到了一個問題。 活動指標重複數次。(參見下圖)

在屏幕截圖,第一活動的指標具有正確的佈局,但下面的一個是較暗這意味着其他幾個活動指標已經覆蓋在彼此的頂部。 然後他們永遠不會消失。

當談到代碼:

我有一個web視圖和兩個委託方法控制活動指標。

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

你會分享你怎麼網頁視圖添加到您的屏幕,將工作(即根視圖)? – tropicalfish

+0

您正在創建新的指標,每次你打電話給我的代碼,嘗試刪除當前的一個,如果它再次用Bool調用,或者只是使用它的單例類的同一個實例,而不是類功能 – Tj3n

回答

0

試試這個 -

添加下面一行在你的viewController類 -

var activityIndicator: UIActivityIndicatorView? 

並更新你e startActivityIndicatorstopActivityIndicator方法如下─一樣

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() 
} 

希望你:)