2012-01-20 23 views
10

Coloqué múltiples UIWebView uno al lado del otro en un UIScrollView. Cada UIWebView incluye una vista de "navegador web" que muestra un archivo HTML local. Lamentablemente, no tengo idea de cómo cargar las vistas web en segundo plano y, al mismo tiempo, prevenir o detener la ejecución de las funciones de JavaScript que están incluidas en los archivos HTML. Me refiero a "en el fondo" mientras veo los primeros paneles y, mientras tanto, los paneles restantes simplemente se cargan de forma lenta y silenciosa. Vi diferentes aplicaciones (como pugpig) hacer esto - carga las páginas HTML y detiene las animaciones de JavaScript - de alguna manera puede detener el JavaScript para animar el efecto de fundido completo que uso frecuentemente en mis páginas HTML entre los modificadores de pestañas y en este momento Yo cargo el panel, continúa la animación de desvanecimiento.Pausar la ejecución de JavaScript en UIWebView

Entonces, la pregunta es:

¿Cómo puedo hacer una pausa en una animación de JavaScript y prevenir problemas de memoria utilizando el código de Objective-C y cómo puedo continuar la animación se desvanecen una vez que mostrar el panel?

Respuesta

4

Ha intentado inyectar JavaScript (es decir - (NSString*) stringByEvaluatingJavaScriptFromString: (NSString *)script) que observa onblur y onfocus del window, o pageshow y pagehide? This post propone un par de soluciones para eso.

Por lo tanto, usted podría intentar algo así como

$(window).blur(function(){ 
    // when the web view loses focus 
}); 
$(window).focus(function(){ 
    // when the web view gains focus 
}); 

Si eso no funciona, puede intentar pagehide y pageshow eventos:

function pageShown(evt) 
{ 
    if (evt.persisted) 
     // The page was just restored from the Page Cache 
    else 
     // The initial load. This is the same as the page load event 
} 

function pageHidden(evt) 
{ 
    if (evt.persisted) 
     // The page was suspended and placed into the Page Cache 
    else 
     // This is the same as the page unload event 
} 

window.addEventListener("pageshow", pageShown, false); 
window.addEventListener("pagehide", pageHidden, false); 
0

Tal vez usted puede intentar evaluar (usando stringByEvaluatingJavaScriptFromString) un propósito-defectuosa fragmento de código de JavaScript y hacer que el js-intérprete se bloquee?

<script> var j =  // note: missing value, error! 
</script> 
1

Creo que se puede controlar los archivos JavaScript de animación que se ejecuta en el HTML (que ha dicho la página es local). Lo que haría sería ajustar la animación en una función JS que se llamará desde Cocoa (hay toneladas de referencias para eso en StackOverFlow, por ejemplo, - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script).

Luego crearía una pila que tiene un registro para cada una de las páginas HTML que desea cargar de forma diferida. En cada UIScrollView scrollViewDidScroll: verificaría si un desplazamiento en el tamaño de un tamaño completo de la vista web se hubiera realizado, si es así, sacaría ese registro de la pila y llamaría a la función JavascriptAnimation de Javascript que mencionamos antes en la siguiente vista web.

Si necesita comunicación a doble cara (de javascript a cocoa) por ejemplo para indicar que la animación se completó puede usar JSBridge. (How do I call an Objective-C method from JavaScript on UIWebView?)

Cuestiones relacionadas