UIWebView con barra de progreso

Hola, soy nuevo en progtwigción y estoy intentando hacer mi primera aplicación para iPhones en Xcode. Mi aplicación contiene un button que abre una UIWebView cuando se presiona y carga una página de inicio. Ahora también quiero agregar una Vista de progreso a la WebView como Safari también usa, lo que indica el progreso de la carga de la página. ¿Cómo puedo hacer eso?
Mi código hasta ahora para cargar la URL en UIWebView:

.marido

IBOutlet UIWebView *webView; 

.metro

 - (void)viewDidLoad { [webView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:@"http:/www.google.com/"]]]; 

¡Gracias por tu ayuda!

Para tener una UIProgressView precisa, debe tener alguna tarea que:

  • Puede get información mientras no esté completa
  • Cuantifique su "completitud" como un porcentaje basado en esa información.

Ahora cuando cargue su UIWebView , eso no es posible. Y Apple tampoco lo hace. Apple a menudo utiliza UIProgressView s falsos para darle algo que ver mientras la página se está cargando. Mail también usa vistas de progreso falsas. Ve a probarlo por ti mismo. Así es como funcionan las falsas miradas de progreso de Apple:

  • La vista de progreso comienza a moverse a una velocidad lenta y constante
  • Si la tarea termina antes de que la barra se complete, de repente se pasa al rest al 100% antes de desaparecer
  • Si la tarea lleva mucho time, la vista de progreso se detendrá en un 95% y permanecerá allí hasta que se complete la tarea.

Para lograr esto, tendrá que animar el progresoView manualmente. Podrías subclassarlo, pero eso probablemente sea un poco avanzado para ti. La forma más simple sería esto:

En myViewController.h

 @interface myViewController : UIViewController { BOOL theBool; //IBOutlet means you can place the progressView in Interface Builder and connect it to your code IBOutlet UIProgressView* myProgressView; NSTimer *myTimer; } @end 

En myViewController.m

 #import "myViewController.h" @implementation myViewController - (void)webViewDidStartLoad:(UIWebView *)webView{ myProgressView.progress = 0; theBool = false; //0.01667 is roughly 1/60, so it will update at 60 FPS myTimer = [NSTimer scheduledTimerWithTimeInterval:0.01667 target:self selector:@selector(timerCallback) userInfo:nil repeats:YES]; } - (void)webViewDidFinishLoad:(UIWebView *)webView{ theBool = true; } -(void)timerCallback { if (theBool) { if (myProgressView.progress >= 1) { myProgressView.hidden = true; [myTimer invalidate]; } else { myProgressView.progress += 0.1; } } else { myProgressView.progress += 0.05; if (myProgressView.progress >= 0.95) { myProgressView.progress = 0.95; } } } @end 

Luego, donde se completa tu tarea, establece theBool = true; y la vista de progreso se cuidará solo. Cambia los valores en la instrucción if para controlar la velocidad de la animation.

Swift 2.2

 class ViewController: UIViewController,UIWebViewDelegate { @IBOutlet weak var webView: UIWebView! @IBOutlet weak var activityIndicator: UIActivityIndicatorView! @IBOutlet weak var myProgressView: UIProgressView! var myTimer = NSTimer() var theBool = Bool() override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "https://www.youtube.com") let request = NSURLRequest(URL: url!) activityIndicator.hidesWhenStopped = true activityIndicator.startAnimating() webView.loadRequest(request) } func timerCallback(){ if theBool { if myProgressView.progress >= 1 { myProgressView.hidden = true myTimer.invalidate() }else{ myProgressView.progress += 0.1 } }else{ myProgressView.progress += 0.05 if myProgressView.progress >= 0.95 { myProgressView.progress = 0.95 } } } func webViewDidStartLoad(webView: UIWebView) { activityIndicator.startAnimating() myProgressView.progress = 0 theBool = false myTimer = NSTimer.scheduledTimerWithTimeInterval(0.01667,target: self,selector: #selector(ViewController.timerCallback),userInfo: nil,repeats: true) } func webViewDidFinishLoad(webView: UIWebView) { activityIndicator.stopAnimating() theBool = true } } 

Seguí la respuesta de Wolflink y encontré el mismo problema al no tener el progresoView animado.

Después de leer la Referencia de class NSTimer:

https://developer.apple.com/library/Mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/timerWithTimeInterval:target:selector:userInfo: repite :

En Discusión , puede leer: "Debe agregar el nuevo timer a un ciclo de ejecución, utilizando addTimer: forMode:".

entonces agregué

[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];

después

myTimer = [NSTimer timerWithTimeInterval:0.01667 target:self selector:@selector(timerCallback) userInfo:nil repeats:YES];

Funcionó para mí (como recomendó WolfLink hice la subclass UIProgressView)

Es difícil (si es posible), ya que tendría que rastrear todos los resources cargados por el sitio, pero …

Tengo una idea Es más un truco que una solución real, pero creo que incluso Apple usa esto en la aplicación Mensajes 🙂

  1. Cuando comiences a cargar la página, comienza una animation al 90% del progreso (digamos con una duración de 1.5 segundos, tal vez sea diferente para Wi-Fi, LTE, 3G, …).
  2. Cuando la página se carga mientras tanto, anima rápidamente el progreso al 100% . ¡Hecho!
  3. Si la página tarda más time en cargarse, la barra de progreso se detendrá en un 90% y esperará allí . ¡Momento frustrante cuando el usuario mira lento indicador de giro en la barra de estado! Y finalmente, la página termina de cargarse y (como en la viñeta 2.) reproduce la animation rápida al 100% . ¡Hecho!

Creo que todos sabemos, que así es como funciona la aplicación de posts, ya que no creo que el envío de SMS se pueda rastrear con un progreso tan preciso 🙂

Si alguien quiere hacerlo en swift 3, pasé algunos días tratando de resolverlo y finalmente lo hice.

Aquí está el código 🙂

 override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "http://google.com") let request = NSURLRequest(url: url as! URL) webView.loadRequest(request as URLRequest) 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: Error) { self.progressView.setProgress(1.0, animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 

Hubiera agregado un comentario, en lugar de agregar una respuesta, ¡pero todavía no tengo suficiente reputación para comentar!

Hace solo un par de días pregunté casi exactamente la misma pregunta. En esa pregunta incluí la solución que se me ocurrió. Mi solución es más complicada que la de WolfLink, pero rastrea el progreso real de cargar la página, aunque no es 100% exacta. Como WolfLink ha dicho que eso no es posible. Mi pregunta se puede encontrar aquí: Barra de progreso para UIWebView

Tenga en count la forma en que lo haga, deberá verificar la propiedad de carga de UIWebView para determinar cuándo se completó la carga de la página.