2010-05-10 5 views
6

В моем коде я пытаюсь показать UIWebView при загрузке страницы, а затем, когда это будет сделано, захватить изображение из веб-представления в кеш и отобразить позже (так что мне не нужно перезагружать и отображать веб-страница).Как узнать, когда UIWebView закончил рисование в контексте?

У меня есть кое-что вдоль линий:

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

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

Проблема я бегу в том, что из-за UIWebView «s черепицей, иногда только половина страницы, визуализируется в контексте к тому времени Я фиксирую изображение.

Есть ли способ обнаружить или заблокировать на потоке рендеринга фона UIWebView, чтобы я мог получить изображение только после того, как весь рендеринг закончен?


UPDATE: Это может быть то, что условия нить гонки были отвлекающим маневром (неясно, из документации, в любом случае, независимо от того UIWebView «s пользовательского слоя или CATiledLayer в общих блоках на его фоне потоков) ,

Это может быть проблема аннулирования (несмотря на несколько видов звонков на setNeedsDisplay как на UIWebView, так и на его слой). Изменение границ UIWebView перед рендерингом, похоже, устранило проблему «не рисовать все».

У меня все еще возникла проблема, когда в старой шкале было нарисовано несколько плиток, но вызов renderInContext: дважды, похоже, достаточно смягчил это.

ответ

0

UIWebView, вероятно, использует CATiledLayer или специализированную производную. Вы можете заменить слой каким-то своим выбором, например простым CALayer, который не выполняет рисование с резьбой. Замените слой перед загрузкой содержимого.

Если замена слоя стандартным CALayer не работает, возможно, вам придется создать свой собственный подкласс, который будет эмулировать поведение CATiledLayer без фактического потока.

Edit:

От 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. */ 

Таким образом, вы можете просто быть в состоянии установить содержание в ноль перед вызовом renderInContext: