Как я могу сказать, когда UIWebView закончил тянуть к контексту?

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

У меня есть что-то вроде:

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

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

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

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


ОБНОВЛЕНИЕ: может случиться так, что условия состязания потока были отвлекающим маневром (это неясно из документации, во всяком случае, ли UIWebViewпользовательский слой или a CATiledLayer в общих блоках на его фоновых потоках).

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

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

6
задан Fiona Hopkins 11 May 2010 в 01:23
поделиться

1 ответ

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

Так что вы можете просто установить содержимое в nil перед вызовом renderInContext:

0
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: