Способы улучшения производительности прокрутки UIWebView?
Я создаю приложение, которое включает UIWebView
, содержащее большое количество изображений, CSS, встроенное видео и обработчики дескриптора JavaScript. Производительность прокрутки - затворничество, и я ищу информацию о наиболее эффективных способах ее улучшения.
Что, если какая-либо из следующих характеристик приведет к прокрутке laggy UIWebView
? Какие другие факторы могут препятствовать работе?
- Количество изображений
- Должен ли я удалять изображения из DOM, когда пользователь прокручивается мимо них и добавляет их обратно, если они прокручивают резервные копии?
- Размер изображений
- Будет ли качество изображения Retina в веб-представлении влиять на производительность прокрутки намного больше, чем на более мелкие версии?
- Масштабирование изображения
- Будет ли изменение размера изображений раньше времени иметь большую разницу, а не полагаться на веб-представление для масштабирования на основе объявлений типа
width: 100%;
?
- CSS
- Я избегал
box-shadow
, но существуют ли другие свойства CSS, которые также известны для неблагоприятного влияния на производительность прокрутки?
Если есть какие-либо другие ресурсы или инструменты, которые можно использовать для профилирования, я люблю их слышать.
Ответы
Ответ 1
Это ответ, который я получил от технической поддержки Apple Developer некоторое время назад:
В настоящее время мы не предоставляем никаких механизмов для оптимизации рендеринга UIWebView. Причина, по которой вы видите разницу, связана с тем, что Mobile Safari и UIWebView не используют один и тот же механизм рендеринга.
Производительность зависит от загруженного содержимого. Если используются javascripts или плагины, это может помешать работе.
Я рекомендую вам опубликовать отчет об ошибке в http://developer.apple.com/bugreporter/, в котором подробно описывается ваша ситуация. Это также будет информировать вас о статусе вашего отчета об ошибке.
Возможной альтернативой UIWebView будет библиотека DTCoreText с открытым исходным кодом: https://github.com/Cocoanetics/DTCoreText, которая поддерживает приложение Float Reader: http://itunes.apple.com/us/app/float-reader/id447992005?mt=8
Ответ 2
Ребята из LinkedIn провели обширную работу с UIWebView и HTML5 на своем iPad-приложении. Весь их канал, который тяжел с изображениями, текстами и видео, отображается внутри UIWebView.
Следующее сообщение в блоге должно дать вам массу отправных точек для повышения производительности.
LinkedIn для iPad: 5 методов для плавной бесконечной прокрутки в HTML5
Ответ 3
У меня была аналогичная проблема некоторое время назад. Я обнаружил, что возможность веб-просмотра внутри прокрутки улучшает производительность прокрутки. После завершения загрузки веб-просмотра я отключил прокрутку в веб-просмотре, установил кадр webview и размер прокрутки viewSize в размере содержимого веб-просмотра.
-(void) webViewDidFinishLoad:(UIWebView *)webView {
float size = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
[self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, size)];
[webView setFrame:CGRectMake(webView.frame.origin.x,
webView.frame.origin.y,
webView.frame.size.width,
size)];
[(UIScrollView*)[webView.subviews objectAtIndex:0] setScrollEnabled:NO];
}
Я предполагаю, что веб-просмотр не загружает изображение, пока оно не появится на экране, что вызвало заикание, и, поместив его в scrollview и установив кадр на размер содержимого, он должен загрузить их вперед времени, но я не уверен. Я также уверен, что это имеет последствия (т.е. Увеличение использования памяти спереди), но у меня никогда не было проблем с этим.