2012-04-15 9 views
14

Estoy compilando una aplicación que incluye un UIWebView que contiene una gran cantidad de imágenes, CSS, video incrustado y controladores de toque de JavaScript. El rendimiento de desplazamiento es intermitente y estoy buscando información sobre las formas más efectivas de mejorar esto.¿Cómo mejorar el rendimiento de desplazamiento de UIWebView?

¿Cuál de las siguientes características conduce a laggy UIWebView de desplazamiento? ¿Qué otros factores pueden estar obstaculizando el rendimiento?

  • Cantidad de imágenes
    • ¿Debo eliminar imágenes desde el DOM como el usuario se desplaza por delante de ellos, y la adición de nuevo si se desplazan una copia de seguridad?
  • tamaño de las imágenes
      imágenes
    • Will Retina calidad en una vista web afectar el rendimiento del desplazamiento mucho más que versiones más pequeñas lo haría?
  • escalado de imagen
    • ¿Podría cambiar el tamaño de las imágenes antes de tiempo hacer una gran diferencia, en lugar de confiar en la vista web a escala basada en las declaraciones como width: 100%;?
  • CSS
    • he evitado box-shadow, pero hay otras propiedades CSS que también son conocidos por afectar negativamente el rendimiento de desplazamiento?

Si hay algunos otros recursos o herramientas que se pueden utilizar para el perfilado, no tengo amor a oír hablar de ellos.

Respuesta

1

Tuve un problema similar hace un tiempo. Descubrí que poner la vista web dentro de una vista de desplazamiento mejoraba el rendimiento de desplazamiento dramáticamente. Después de que la vista web terminó de cargarse, desactivé el desplazamiento en la vista web, establecí el marco de la vista web y el tamaño de contenido de la vista de desplazamiento para que fuera del tamaño del contenido de la vista web.

-(void) webViewDidFinishLoad:(UIWebView *)webView { 
    float size = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; 
    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, size)]; 
    [webView setFrame:CGRectMake(webView.frame.origin.x, 
           webView.frame.origin.y, 
           webView.frame.size.width, 
           size)]; 

    [(UIScrollView*)[webView.subviews objectAtIndex:0] setScrollEnabled:NO]; 
} 

Estoy asumiendo que la vista web no se carga una imagen hasta que esté a punto de aparecer en la pantalla, lo que causó el tartamudeo, y poniéndola en una ScrollView y fijando el marco al tamaño del contenido se debe cargarlos antes de tiempo, pero no estoy seguro. También estoy seguro de que esto tiene consecuencias (es decir, mayor uso de memoria por adelantado), pero nunca tuve problemas para hacerlo de esta manera.

+3

no puedo abajo-votos aún, pero esto es un grave no-no. Esta solución hace que todo el webView se dibuje en su CALayer (invalidando el mecanismo de renderizado de embaldosado de UIWebView), causando un gran uso de memoria. La descripción de OP de sus páginas, "que contiene una gran cantidad de imágenes, CSS, video incrustado y manejadores de tap JavaScript", provocaría que la aplicación utilizara una cantidad excesiva de memoria. –

+2

Entonces, ¿qué estás diciendo es que cambié la memoria por el rendimiento? Eso es algo de lo que pensé. Estoy de acuerdo en que no es una gran solución, pero fue la única forma en que pude encontrar para mejorar el desplazamiento. Y dado que sabía exactamente qué iba a cargarse en la vista web antes de tiempo y todos los activos se incluyeron en la aplicación, no tuve problemas para hacerlo de esta manera. – rjowens

+1

Bueno, este tipo de comercio es muy peligroso con UIWebView, porque crece en la memoria de forma muy rápida y agresiva. Y cuando el contenido se vuelva más grande y más complejo, pronto encontrará un bombardeo de didReceiveMemoryWarning-s y eventualmente se bloqueará. –

8

Esta es la respuesta que recibí de Apple Developer Soporte técnico hace un tiempo:

En este momento, no ofrecemos ningún mecanismo para optimizar la prestación de UIWebView. La razón por la que ve la diferencia se debe a que Mobile Safari y UIWebView no usan el mismo motor de representación.

El rendimiento depende del contenido cargado. Si hay javascripts en ejecución o complementos que se utilizan, esto puede dificultar el rendimiento.

Le recomiendo que presente un informe de errores al http://developer.apple.com/bugreporter/ detallando su situación. Esto también lo mantendrá informado sobre el estado de su informe de errores.

Una posible alternativa a UIWebView sería la biblioteca DTCoreText de código abierto: https://github.com/Cocoanetics/DTCoreText, que alimenta la aplicación del flotador Lector: http://itunes.apple.com/us/app/float-reader/id447992005?mt=8

+0

Sé que el rendimiento depende del contenido cargado. Estoy tratando de comprender qué cambios en mi contenido (por ejemplo, imágenes más pequeñas, menos imágenes, evitar ciertas propiedades de CSS, etc.) tendrán el mayor efecto. –

Cuestiones relacionadas