objective c example ¿Cómo puedo saber cuándo finaliza(no carga) un UIWebView?



uiwebview load url (5)

if (webView.loading == YES)
        {
            //Load image
        }

Algo así podría funcionar.

Sé cuándo está listo para cargar ... (webViewDidFinishLoad), pero quiero usar

[webView.layer renderInContext:UIGraphicsGetCurrentContext()];

para crear una imagen desde UIWebView. Ocasionalmente obtengo la imagen antes de que webView termine su renderizado. Puedo usar performSelector para retrasar la obtención de la imagen, pero la cantidad de espera es arbitraria y frágil.


Answer #1


¿Qué hay de usar el evento window.onload o jQuerys $ (document) .ready para activar la devolución de llamada shouldStartLoad?

Algo como:

$(document).ready(function(){
    location.href = "app://do.something"
})

y en su UIWebViewDelegate haga algo como:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = request.URL;

    if([url.host isEqualToString:@"app"]){
        //maybe check for "do.something"
        //at this point you know, when the DOM is finished
    }
}

Con este método puede reenviar todos los eventos posibles desde el código JS a su código obj-c.

Espero que ayude. ¡El ejemplo de código está escrito en el navegador y, por lo tanto, no está probado! ;-)


Answer #2

Si tiene acceso al archivo HTML y puede editarlo, simplemente agregue una variable especial que le dirá al código que la renderización está completa.
A continuación, utilice el método stringByEvaluatingJavaScriptFromString para saber si debe iniciar algunas acciones o no.
El siguiente ejemplo es bastante sucio, pero espero que ayude y te dé la idea:

(void)webViewDidFinishLoad:(UIWebView *)webView
{
    BOOL renderingDone = NO;
    while (!(renderingDone == [[webView stringByEvaluatingJavaScriptFromString:@"yourjavascriptvariable"] isEqualToString:@"YES"]))
    {
        // the app will be "freezed" till the moment when your javascript variable will not get "YES" value 
    }
    // do your stuff, rendering is done 
}

Answer #3
- (void)webViewDidFinishLoad:(UIWebView *)webView {
   if (webView.isLoading)
        return;
    else
    {
            [self hideProgress];
    }

}

Answer #4

Esto puede depender del tipo de contexto de gráficos en el que necesite que se visualice la vista, pero puede llamar

- (void)drawRect:(CGRect)area forViewPrintFormatter:(UIViewPrintFormatter *)formatter

lo que aparentemente engaña a UIWebView para que piense que se está imprimiendo. Esto puede ayudar si su objetivo final es capturar la página completa. Recientemente tuvimos el problema de que, incluso si la página estaba cargada por completo, al llamar a plain old -drawRect: no representaba toda la página si parte de ella estaba fuera de la pantalla.





uiwebview