2010-10-04 12 views
5

Me muestran una pequeña cantidad de contenido local en un UIWebView, aproximadamente 3 párrafos de texto y una imagen de 100x100px. Cuando se coloca el UIWebView en el controlador de navegación, tarda aproximadamente medio segundo antes de que se muestre el contenido. Esto ocurre en el dispositivo, no en el simulador. Obviamente, UIWebView necesita hacer algo de trabajo antes de mostrar el contenido, pero ¿hay alguna forma de que pueda hacer esto antes de que aparezca la vista presionada? No he tenido suerte haciendo esto yo mismo.Retraso de UIWebView en la carga de contenido local

Aquí es donde estoy creando y empujando el controlador de vista que contiene el UIWebView:

ArticleViewController* viewController = [[ArticleViewController alloc] init]; 
viewController.article = article; 
[viewController view]; //touch the view so it gets loaded 
[viewController loadWebView]; //load the web view content 
[self.navigationController pushViewController:viewController animated:YES]; 
[viewController release]; 

y aquí está el método loadWebView:

-(void)loadWebView { 
    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSURL *baseURL = [NSURL fileURLWithPath:path]; 

    NSString* content = article.content; 

    NSString *html = [NSString stringWithFormat:@"\ 
         <html><body style='background-color: transparent'><style type=""text/css"">body {font-family: helvetica; color: black; font-size: 10pt; margin: 10px 10px 10px 10px}</style>\ 
         %@<div style='text-align:center'><a href='13443574_9709e4cf37.jpg?photographer=test' style='-webkit-tap-highlight-color:rgba(0,0,0,0);'><img src='13443574_9709e4cf37.jpg' height='160' width='230'></a></div></body></html>", content]; 
    [self.webView loadHTMLString:html baseURL:baseURL]; 
} 

Anteriormente había [viewController loadWebView] en el método viewDidLoad , pero el resultado parece ser el mismo. Una pantalla en blanco cuando se presiona viewController, seguido por el contenido que se carga medio segundo después.

¿Alguna idea?

Respuesta

1

Vas a hacer que el usuario espere, la única pregunta es: ¿es antes o después de que aparezca la vista web? Si está configurado en "antes", debe crear el controlador, cargar la vista web, pero espere presionarlo hasta que se active el método -webViewDidFinishLoad: delegate. Una vez que lo reciba, puede presionar la vista.

7

problemas confirmados

yo también veo un medio segundo o más de retraso con una pantalla en blanco antes de que aparezca el contenido de mi UIWebView. Esto ocurre solo en el primer uso de UIWebView durante esa ejecución de la aplicación. Las apariciones sucesivas de UIWebView son casi instantáneas. Por lo tanto, me parece a mí y a otras personas que la demora debe deberse a que las bibliotecas WebKit deben cargarse e inicializarse.

calentamiento WebKit

No se puede eliminar el retardo. Pero puede mover ese retraso al inicio de su aplicación, para disminuir el efecto molesto de la "pantalla en blanco" para sus usuarios. El truco es cargar UIWebView con una página falsa fuera de la pantalla, durante el lanzamiento de su aplicación. Cree una página web mínima HTML5 en una cadena codificada. Uso un contenido HTML5 válido y correcto para minimizar el tiempo que UIWebView/WebKit demora en analizar.

Esta técnica funciona notablemente bien en hardware real (iPhone 3GS), no sólo el simulador de iOS .

En mis delegados de aplicaciones didFinishLaunchingWithOptionsmethod, la parte inferior del código según norma ARC se parece a esto:

… 
[self.window makeKeyAndVisible]; 

// Performance optimization: Warm up the UIWebView widget and its related WebKit libraries. 
// We are choosing the trade-off between (A) a slight delay here during app launch to create and abandon a bogus UIWebView instance, and 
// (B) a flash of white and noticeable delay as the UINavigationController slides in from the right the first UIWebView we display during the app run. 
UIWebView* bogusWebView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
NSString* html = @"<!doctype html><html lang=en><head><meta charset=utf-8><title>blah</title></head><body><p>bogus content</p></body></html>"; 
[bogusWebView loadHTMLString:html baseURL:nil]; // Load the page. 
bogusWebView = nil; // Not really needed, but self-documents that we intend to discard this object. 

return YES; 

Esta técnica parece reducir la mayoría, pero no todo del retraso de medio segundo aproximada durante el usuario de primera aparición de UIWebView en la pantalla. Llegué a la conclusión de que la mayor parte de la demora se debe al calentamiento de WebKit, pero debe haber cierta sobrecarga relacionada con la presentación gráfica de UIWebView en pantalla. Si es así, no podemos eliminar la sobrecarga restante con el trabajo fuera de la pantalla. Sin embargo, esta técnica elimina más del retraso inicial. Por lo tanto, la primera impresión de mi aplicación por parte del usuario no será "lenta".

+0

GRACIAS !!!!! webkit de hecho necesita ser calentado –

+0

Esta debería ser la respuesta aceptada –

Cuestiones relacionadas