2010-10-04 3 views
5

Je visualise une petite quantité de contenu local dans un UIWebView, soit environ 3 paragraphes de texte et une image 100x100px. Lorsque le UIWebView est poussé sur le contrôleur de navigation, il prend environ une demi-seconde avant que le contenu est affiché. Cela se produit sur l'appareil, pas dans le simulateur. Évidemment, UIWebView doit faire un peu de travail avant d'afficher le contenu, mais est-il possible de le faire avant que l'affichage poussé ne s'affiche? Je n'ai pas eu de chance de le faire moi-même.Retard UIWebView lors du chargement de contenu local

est ici où je créais et en poussant le contrôleur de vue qui contient le 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]; 

Et voici la méthode 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]; 
} 

Auparavant, j'avais [viewController loadWebView] dans la méthode viewDidLoad , mais le résultat semble être le même. Un écran vide lorsque le viewController est enfoncé, suivi du chargement du contenu une demi-seconde plus tard.

Des idées?

Répondre

1

Vous allez faire attendre l'utilisateur, la seule question est: est-ce avant ou après que le webview apparaisse? Si vous avez défini "avant", vous devez créer le contrôleur, charger l'affichage Web, mais attendre de le pousser jusqu'à ce que la méthode -webViewDidFinishLoad: delegate se déclenche. Une fois que vous recevez cela, vous pouvez pousser la vue.

7

Problème confirmé

Je vois aussi une demi-seconde ou plus de retard avec un écran blanc avant mon contenu UIWebView apparaît. Cela se produit uniquement lors de la première utilisation d'un UIWebView pendant cette exécution de l'application. Les apparitions successives d'UIWebView sont presque instantanées. Il me semble donc, ainsi qu'à d'autres personnes, que le délai doit être dû aux bibliothèques qui ont besoin de charger et d'initialiser.

Échauffement WebKit

Vous ne pouvez pas éliminer le retard. Mais vous pouvez déplacer ce délai au début de votre application, afin de réduire l'effet gênant de «l'écran vide» pour vos utilisateurs. L'astuce consiste à charger UIWebView avec une fausse page hors écran, lors du lancement de votre application. Construire une page web minimale HTML5 dans une chaîne codée en dur. J'utilise un contenu HTML5 correct et valide pour minimiser le temps pris par UIWebView/WebKit pour analyser.

Cette technique fonctionne sensiblement bien sur le matériel réel (iPhone 3GS), non seulement le iOS Simulator.

Dans mes délégués app didFinishLaunchingWithOptionsmethod, le fond du ARC Code -conforme ressemble à ceci:

… 
[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; 

Cette technique semble réduire la plupart, mais pas tout à fait tous les environ délai d'une demi-seconde pendant l'utilisateur de première apparition d'UIWebView à l'écran. Je conclus que la plupart du retard est dû à l'échauffement de WebKit, mais il doit y avoir des frais généraux liés à la présentation graphique d'un UIWebView à l'écran. Si tel est le cas, nous ne pouvons pas éliminer les frais généraux restants avec un travail hors écran. Mais néanmoins, cette technique élimine le plus du délai initial. Ainsi, la première impression de l'application par mon utilisateur ne sera pas "lente".

+0

MERCI !!!!! webkit doit en effet être réchauffé –

+0

Ceci devrait être la réponse acceptée –

Questions connexes