Progressbar WebView в Swift

Я пишу webapp в swift с xcode. У меня вопрос: «Как добавить индикатор прогресса, который показывает загрузку каждой страницы?»

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

(Извините за мой английский)

В этом посте вы можете найти очень хороший ответ . Вы можете просто добавить индикатор выполнения в качестве подзаголовка в свой веб-просмотр. Основная проблема заключается в точности индикатора выполнения. Предлагаемый ответ заключается в том, чтобы начать с анимации его постоянно, заблокировать его на 95% при загрузке и когда ваш запрос будет завершен, застегните его на 100%.

Вот решение в Swift:

Добавьте эти свойства:

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

Взял меня на себя, чтобы понять, как определить, когда сайт полностью загружен и оживить индикатор выполнения в соответствии … после некоторых хардкорных googling это лучшее, что я мог придумать. многие люди говорят, что многое из этого не помогло мне … добавьте, и улучшите пожалуйста, дайте мне знать, если вы выясните что-то лучше.

Я использую это и хорошо смотрю.

 @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)

  • Какие действия запускают функцию webViewWebContentProcessDidTerminate
  • Как изменить высоту webView динамически?
  • Nativescript + iOS webview + локальные файлы
  • Как внедрить Google Login в WkWebView, переключаясь на SFSafariViewController
  • Форма Xamarin: CustomWebView на iOS не показывал простую веб-страницу
  • PhoneGap iOS + DOM Exception 18
  • ios 8.4.1 веб-черный экран
  • Как проверить, существует ли файл в папке «Документы»?
  • Swift 3 WKWebView 'URLRequest'; вы хотели использовать «как» для явного преобразования? (BUG)
  • как управлять высотой UITableHeaderView на основе контента webview с использованием автоматической компоновки
  • Как настроить содержание в WebView в iOS?
  • Давайте будем гением компьютера.