2017-02-13 38 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() 
} 

希望你:)