В моем коде я пытаюсь показать 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:
дважды, кажется, смягчил это достаточно.
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: