Swift中的Progressbar WebView

我用xcode写了一个webapp。 我有一个问题:“我怎样才能添加一个显示每个页面加载的进度条?

@IBOutlet var webView: UIWebView! override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) webView.loadRequest(request) } 

(对不起我的英语不好)

你可以在这篇文章中find一个非常好的答案 。 你可以添加一个进度条作为子视图到你的web视图。 主要问题是进度条的准确性。 build议的答案是从不断的animation开始,在加载完成时将其阻止在95%,当你的请求完成时,将它压缩到100%。

Swift中有一个解决scheme:

添加这些属性:

 //Add this progress view via Interface Builder (IBOutlet) or programatically let myProgressView: UIProgressView var theBool: Bool var myTimer: NSTimer 

这些函数将填充进度视图。 你可以玩的参数:

 func funcToCallWhenStartLoadingYourWebview() { self.myProgressView.progress = 0.0 self.theBool = false self.myTimer = NSTimer.scheduledTimerWithTimeInterval(0.01667, target: self, selector: "timerCallback", userInfo: nil, repeats: true) } func funcToCallCalledWhenUIWebViewFinishesLoading() { self.theBool = true } func timerCallback() { if self.theBool { if self.myProgressView.progress >= 1 { self.myProgressView.hidden = true self.myTimer.invalidate() } else { self.myProgressView.progress += 0.1 } } else { self.myProgressView.progress += 0.05 if self.myProgressView.progress >= 0.95 { self.myProgressView.progress = 0.95 } } } 
  var theBool: Bool var myTimer: NSTimer var didFinishTimer: NSTimer required init(coder aDecoder: NSCoder) { self.theBool = false self.myTimer = NSTimer() self.didFinishTimer = NSTimer() super.init(coder: aDecoder) } func startAnimatingProgressBar() { self.theBool = false myProgressView.hidden = false myProgressView.alpha = 0 UIView.animateWithDuration(0.2, animations: { () -> Void in self.myProgressView.alpha = 0.6 }) self.myProgressView.progress = 0.0 //Tweek this number to alter the main speed of the progress bar var number = drand48() / 80; // println("startAnimatingProgressBar|\(number)") self.myTimer = NSTimer.scheduledTimerWithTimeInterval(number, target: self, selector: "timerCallback", userInfo: nil, repeats: true) // println("myTimer|\(myTimer)") } func finishAnimatingProgressBar() { self.theBool = true } func timerCallback() { if self.theBool { if self.myProgressView.progress >= 1 { UIView.animateWithDuration(0.2, animations: { () -> Void in self.myProgressView.alpha = 0 // }, completion: { (success:Bool) -> Void in // self.myProgressView.hidden = true }) self.myTimer.invalidate() } else { //Loaded and zoom to finish var number = drand48() / 40 // println("finished:\(number)") self.myProgressView.progress += Float(number) } } else { //Start slow if self.myProgressView.progress >= 0.00 && self.myProgressView.progress <= 0.10 { var number = drand48() / 8000; // println("Start:\(number)") self.myProgressView.progress += Float(number) //Middle speed up a bit } else if self.myProgressView.progress >= 0.10 && self.myProgressView.progress <= 0.42 { var smallerNumber = drand48() / 2000; self.myProgressView.progress += Float(smallerNumber) // println("Middle:\(smallerNumber)") //slow it down again } else if myProgressView.progress >= 0.42 && self.myProgressView.progress <= 0.80 { var superSmallNumber = drand48() / 8000; self.myProgressView.progress += Float(superSmallNumber) // println("slow it down:\(superSmallNumber)") //Stop it } else if myProgressView.progress == 0.80 { println("Stop:\(myProgressView.progress)") self.myProgressView.progress = 0.80 } } } var webViewLoads = 0 var webViewDidStart:Int = 0 var webViewDidFinish:Int = 0 func webViewDidStartLoad(webView: UIWebView) { webViewDidStart++ webViewLoads++ if webViewLoads <= 1 { startAnimatingProgressBar() } println("webViewDidStartNumber: = \(webViewDidStart)") println("webViewLoadsStart: = \(webViewLoads)") // println("webViewDidStartLoad") UIApplication.sharedApplication().networkActivityIndicatorVisible = true updateToolbarItems() } func webViewDidFinishLoad(webView: UIWebView) { webViewLoads-- webViewDidFinish++ println("webViewDidFinishLoad \(webViewDidFinish)") if webViewLoads == 0 { finishAnimatingProgressBar() // println("webViewLoads \(webViewLoads)") return } getWebsiteInfo() UIApplication.sharedApplication().networkActivityIndicatorVisible = false updateToolbarItems() func webView(webView: UIWebView, didFailLoadWithError error: NSError) { theBool = true webViewLoads = 0 UIApplication.sharedApplication().networkActivityIndicatorVisible = false println("didFailLoadWithError") updateToolbarItems() } 

花了我很多时间来弄清楚如何确定何时一个网站已经完全加载和animation的进度条根据…一些硬派谷歌search这是我能想出的最好的。 很多人说大部分的东西没有帮助我….添加和改进,请让我知道,如果你找出更好的东西。

我正在使用这个,看起来不错。

 @IBOutlet var webView: UIWebView! @IBOutlet var progressView: UIProgressView! override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) webView.loadRequest(request) webView.delegate=self } func webViewDidStartLoad(_ webView: UIWebView) { self.progressView.setProgress(0.1, animated: false) } func webViewDidFinishLoad(_ webView: UIWebView) { self.progressView.setProgress(1.0, animated: true) } func webView(_ webView: UIWebView, didFailLoadWithError error: NSError?) { self.progressView.setProgress(1.0, animated: true) } 

为什么不使用

loadRequest(_ request: URLRequest, progress: ((UInt, Int64, Int64) -> Swift.Void)?, success: ((HTTPURLResponse, String) -> String)?, failure: ((Error) -> Swift.Void)? = nil)