2010-10-04 16 views
5

Ich bin eine kleine Menge an lokalen Inhalten in einem UIWebView angezeigt, etwa 3 Absätze Text und ein 100x100px Bild. Wenn das UIWebView auf den Nav-Controller geschoben wird, dauert es etwa eine halbe Sekunde, bis der Inhalt angezeigt wird. Dies geschieht auf dem Gerät, nicht im Simulator. Offensichtlich muss das UIWebView etwas arbeiten, bevor der Inhalt angezeigt wird, aber gibt es eine Möglichkeit, dies zu tun, bevor die Push-Ansicht erscheint? Ich habe selbst kein Glück gehabt.UIWebView Verzögerung beim Laden lokaler Inhalte

Hier ist, wo ich die Erstellung und den View-Controller drücken, die die UIWebView enthält:

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]; 

Und hier ist die loadWebView Methode:

-(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]; 
} 

Vorher hatte ich [viewController loadWebView] im viewDidLoad Verfahren , aber das Ergebnis scheint dasselbe zu sein. Ein leerer Bildschirm, wenn der viewController gedrückt wird, gefolgt von dem Inhalt, der eine halbe Sekunde später geladen wird.

Irgendwelche Ideen?

Antwort

1

Sie werden den Benutzer warten lassen, die einzige Frage ist: ist es vor oder nach dem Webview erscheint? Wenn Sie auf "vorher" eingestellt sind, sollten Sie den Controller erstellen, die Webansicht laden, aber warten, bis die Methode -webViewDidFinishLoad: delegate ausgelöst wird. Sobald Sie das erhalten, können Sie die Ansicht verschieben.

7

Problem bestätigt

ich zu sehen, eine halbe Sekunde oder mehr Verzögerung mit einem weißen Bildschirm vor meinem UIWebView Inhalt angezeigt wird. Dies geschieht nur bei der ersten Verwendung eines UIWebView während dieser Ausführung der App. Sukzessive Erscheinungen von UIWebView sind nahezu augenblicklich. So scheint es mir und anderen Leuten, dass die Verzögerung auf WebKit Bibliotheken zurückzuführen ist, die geladen und initialisiert werden müssen.

Warm-up WebKit

Sie nicht die Verzögerung beseitigen. Sie können diese Verzögerung jedoch an den Anfang Ihrer App verschieben, um die lästige Wirkung des "leeren Bildschirms" für Ihre Benutzer zu verringern. Der Trick besteht darin, UIWebView während des Starts Ihrer App mit einer gefälschten Seite außerhalb des Bildschirms zu laden. Erstellen Sie eine minimale HTML5 Webseite in einer fest codierten Zeichenfolge. Ich verwende einen korrekten und gültigen HTML5-Inhalt, um die Zeit zu verkürzen, die UIWebView/WebKit zur Analyse benötigt.

Diese Technik funktioniert gut spürbar auf realer Hardware (iPhone 3GS), nicht nur die iOS Simulator.

In meiner app Delegierten didFinishLaunchingWithOptionsmethod, der Boden des ARC -konforme Code sieht wie folgt aus:

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

Diese Technik scheint den meisten zu reduzieren, aber nicht ganz alle ungefähren halben Sekunde Verzögerung während des Benutzers erstes Erscheinen von UIWebView auf dem Bildschirm. Ich folge, dass der größte Teil der Verzögerung auf das Aufwärmen von WebKit zurückzuführen ist, aber es muss ein gewisser Aufwand für die grafische Darstellung eines UIWebView auf dem Bildschirm entstehen. Wenn dies der Fall ist, können wir den verbleibenden Overhead nicht mit Offscreen-Arbeit beseitigen. Nichtsdestotrotz eliminiert diese Technik am meisten der anfänglichen Verzögerung. Der erste Eindruck meiner Nutzer von meiner App wird also nicht "langsam" sein.

+0

DANKE !!!!! Webkit muss in der Tat aufgewärmt werden –

+0

Dies sollte die akzeptierte Antwort sein –

Verwandte Themen