2010-05-10 12 views
6

W moim kodzie próbuję pokazać UIWebView podczas wczytywania strony, a następnie, po jej zakończeniu, przechwycić obraz z widoku WWW, aby buforować i wyświetlać później (więc nie muszę ponownie ładować i renderować Strona internetowa).Jak mogę sprawdzić, kiedy UIWebView zakończyło rysowanie do kontekstu?

mam coś na wzór:

CGContextRef context = CGBitmapContextCreate(…); 
[[webView layer] renderInContext:context]; 

CGImageRef imageRef = CGBitmapContextCreateImage(context); 
UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Problem biegnę na to, że z powodu UIWebView „s kafli, czasami tylko połowa strony jest renderowany do kontekstu przez czas Przechwytuję obraz.

Czy istnieje sposób wykrywania lub blokowania wątku renderowania tła w tle, aby uzyskać obraz dopiero po zakończeniu renderowania?


UPDATE: Być może, że warunki wyścigowe wątek był czerwony śledź (nie wiadomo z dokumentacji, w każdym razie, czy UIWebView „s niestandardowej warstwy lub CATiledLayer w ogólnych bloków na jej tle wątków) .

Może to być problem z unieważnieniem (pomimo kilku rodzajów połączeń z numerem setNeedsDisplay zarówno na UIWebView, jak i na jego warstwie). Zmieniając granice UIWebView przed wydaniem, wydaje się, że wyeliminowało to problem "nie rysuje całej rzeczy".

nadal uruchomiony na problem gdzie kilka płytek były sporządzone w starej skali, ale nazywając renderInContext: dwukrotnie wydaje się, że w wystarczającym stopniu złagodzone.

Odpowiedz

0

UIWebView prawdopodobnie używa CATiledLayer lub niestandardowej pochodnej. Możesz być w stanie zamienić warstwę na coś według własnego wyboru, na przykład prostą CALayer, która nie tworzy rysunków gwintowanych. Wymień warstwę, zanim zaczniesz ładować zawartość.

Jeśli wymienianie warstwy na standardową CALayer nie działa, być może trzeba będzie utworzyć własną podklasę, która emuluje zachowanie warstwy CATiledLayer bez faktycznego tworzenia wątków.

Edit:

Od CATiledLayer.h

/* Note: do not attempt to directly modify the `contents' property of 
* an CATiledLayer object - doing so will effectively turn it into a 
* regular CALayer. */ 

Więc może po prostu być w stanie ustawić zawartość do zera przed wywołaniem renderInContext:

Powiązane problemy