У меня есть приложение, которое использует UIWebViews
в нескольких контроллерах представления. UIWebViews
используются для рендеринга локально сгенерированного HTML, медленный доступ к сети не требуется.
Чтобы сохранить память, я загружаю их только по требованию, вызванному обратным вызовом viewcontroller viewWillAppear
. (И выгрузить внеэкранные экземпляры в ответ на didReceiveMemoryWarning
сообщения.)
Проблема в том, что пользователь видит HTML, который отображается, иногда сопровождаемый вспышками стилей и другими неприятными артефактами. Я бы предпочел, чтобы рендеринг был сделан за кадром, и я бы показал полностью визуализированный вид, когда он будет готов.
Было бы очень неплохо иметь возможность, чтобы viewWillAppear
не возвращался до тех пор, пока UIWebView не будет полностью обработан. Но как?
Я сообщаю UIWebView
, что визуализировать, отправляя ему сообщение loadHTMLString:baseURL:
. Это асинхронно, и через некоторое время (вскоре) делегат веб-просмотра перезванивает webViewDidFinishLoad
.
Я экспериментировал с запуском runloop внутри viewWillAppear
, запустив либо NSDefaultRunLoopMode
, либо UITrackingRunLoopMode
. Это работает в симуляторе (жалуется в лог
[CATransaction синхронизации] вызывается в транзакции
но работает) но на устройстве оно блокируется, webViewDidFinishLoad
никогда не вызывается.
(Кроме того, похоже, что UIWebView
свойство загрузки не работает. По крайней мере, после того, как я позвонил loadHTMLString:baseURL:
и до получения обратного вызова, это не так.)