2010-10-04 20 views
5

Wyświetlam niewielką ilość zawartości lokalnej w interfejsie UIWebView, z grubsza 3 akapitami tekstu i jednym obrazem 100x100px. Po przesłaniu UIWebView do kontrolera nawigacji, wyświetlenie zawartości zajmuje około pół sekundy. Dzieje się to na urządzeniu, a nie na symulatorze. Oczywiście UIWebView musi wykonać trochę pracy przed wyświetleniem zawartości, ale czy jest jakiś sposób, aby to zrobić, zanim pojawi się widok pushed? Nie miałem szczęścia, robiąc to sam.Opóźnienie UIWebView podczas wczytywania treści lokalnych

Oto gdzie tworzę i przesuwając kontroler widoku, który zawiera 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]; 

A oto metoda 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]; 
} 

Wcześniej miałem [viewController loadWebView] w metodzie viewDidLoad , ale wynik wydaje się być taki sam. Pusty ekran po naciśnięciu kontrolki viewController, a następnie ładowaniu treści pół sekundy później.

Wszelkie pomysły?

Odpowiedz

1

Zamierzacie sprawić, by użytkownik poczekał, pozostaje tylko pytanie: czy jest to przed czy po wyświetleniu strony internetowej? Jeśli jesteś ustawiony na "przed", powinieneś utworzyć kontroler, załadować widok sieciowy, ale poczekaj, aż go przepchniesz, aż wywoła się metoda -webViewDidFinishLoad: delegate. Po otrzymaniu tego możesz popchnąć widok.

7

Problem Potwierdzony

ja też zobaczyć pół sekundy lub więcej opóźnienie z białym ekranie pojawia się przed moją zawartość UIWebView. Dzieje się tak tylko przy pierwszym użyciu UIWebView podczas tego uruchomienia aplikacji. Kolejne wyglądy UIWebView są niemal natychmiastowe. Tak więc wydaje mi się i innym ludziom, że opóźnienie musi wynikać z bibliotek, które wymagają załadowania i zainicjowania.

Rozgrzewka WebKit

Nie można wyeliminować opóźnienia. Możesz jednak przenieść to opóźnienie na początek swojej aplikacji, aby zmniejszyć irytujący efekt "pustego ekranu" dla użytkowników. Sztuką jest ładowanie UIWebView z fałszywą stroną poza ekranem, podczas uruchamiania aplikacji. Zbuduj minimalną stronę internetową HTML5 w postaci zakodowanego ciągu znaków. Używam poprawnej i prawidłowej treści HTML5, aby zminimalizować czas potrzebny na analizę UIWebView/WebKit.

Technika ta działa zauważalnie dobrze na rzeczywistym sprzęcie (iPhone 3GS) nie tylko iOS Simulator.

W moich delegatów aplikacji didFinishLaunchingWithOptionsmethod, dno ARC Kodeksu zgodny ze wygląda następująco:

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

Technika ta wydaje się zmniejszać najbardziej ale nie dość wszystkich przybliżeniu pół-sekundowego opóźnienia podczas Użytkownika pierwsze pojawienie się UIWebView na ekranie. Wnioskuję, że większość opóźnień wynika z nagrzewania się WebKit, ale musi być jakiś narzut związany z graficznym prezentowaniem UIWebView na ekranie. Jeśli tak, nie możemy wyeliminować pozostałych kosztów związanych z pracą poza ekranem. Niemniej jednak ta technika eliminuje początkowe opóźnienie. Tak więc pierwsze wrażenie użytkownika na temat mojej aplikacji nie będzie "powolne".

+0

DZIĘKUJEMY !!!!! webkit rzeczywiście musi zostać rozgrzany –

+0

To powinna być zaakceptowana odpowiedź –

Powiązane problemy