progress bar ios
UIWebView con barra de progreso (6)
Es difícil (incluso posible), ya que tendría que hacer un seguimiento de todos los recursos 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 :)
- Cuando empiece a cargar la página, comience una animación al 90% del progreso (digamos con una duración de 1.5 segundos, tal vez sea diferente para Wi-Fi, LTE, 3G, ...).
- Cuando la página se carga mientras tanto, anima rápidamente el progreso al 100% . ¡Hecho!
- Si la página tarda más tiempo en cargarse, la barra de progreso se detendrá al 90% y esperará allí . ¡Momento frustrante cuando el usuario mira el indicador de giro lento en la barra de estado! Y, finalmente, la página termina de cargarse y (como en el punto 2) se reproduce una animación rápida al 100% . ¡Hecho!
Creo que todos sabemos que esta es la forma en que funciona la aplicación Mensajes, ya que no creo que se pueda rastrear el envío de SMS con un progreso tan preciso :)
Hola, soy nuevo en la programación y estoy tratando de hacer mi primera aplicación para iPhones en Xcode. Mi aplicación contiene un botón que abre un UIWebView cuando se presiona y carga una página principal. Ahora también quiero agregar una Vista de progreso a WebView como también lo usa Safari, lo que indica el progreso de cargar 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!
Seguí la respuesta de Wolflink y encontré el mismo problema al no tener el progressView animado.
Después de leer NSTimer Class Reference:
En Discussion puede leer: "Debe agregar el nuevo temporizador a un ciclo de ejecución, usando addTimer: forMode :."
así que agregué
[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];
después
myTimer = [NSTimer timerWithTimeInterval:0.01667 target:self selector:@selector(timerCallback) userInfo:nil repeats:YES];
Me funcionó (como WolfLink me recomendó, hice la subclase UIProgressView)
Para tener UIProgressView
preciso, debe tener alguna tarea que:
- Puede obtener información de mientras no está completo
- Cuantifique su "integridad" como un porcentaje basado en esa información.
Ahora cuando está cargando su UIWebView
, eso no es posible. Y Apple tampoco lo hace. Apple a menudo utiliza UIProgressView
s falsas para darle algo que mirar mientras se carga la página. Mail también usa vistas de progreso falsas. Ve a probarlo por ti mismo. Así es como funcionan las vistas falsas de progreso de Apple:
- La vista de progreso comienza a moverse a un ritmo lento y constante
- Si la tarea finaliza antes de que se complete la barra, de repente pasa el resto al 100% antes de desaparecer
- Si la tarea lleva mucho tiempo, la vista de progreso se detendrá al 95% y permanecerá allí hasta que se complete la tarea.
Para lograr esto, tendrá que animar el progressView manualmente. Podría subclasificarlo, pero eso probablemente sería un poco avanzado para usted. La forma más simple sería esta:
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 su tarea, configure theBool = true;
y la vista de progreso se ocupará de sí misma. Cambie los valores en la instrucción if para controlar la velocidad de la animación.
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
}
}
Si alguien quiere hacerlo en Swift 3, pasé unos 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 aún no tengo suficiente reputación para comentar!
Hace solo un par de días, hice casi 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% precisa. Como WolfLink dijo, eso no es posible. Mi pregunta se puede encontrar aquí: Barra de progreso para UIWebView
Tenga en cuenta de cualquier forma que lo haga, deberá verificar la propiedad de carga de UIWebView para determinar cuándo se completa la carga de la página.