Как улучшить производительность прокрутки UIWebView?
Кажется, действительно трудно улучшить производительность UIWebView, особенно для таких сайтов, как Mashable или Ars Technica, где загружаются тонны скриптов и распространены длинные многостраничные статьи.
Мне известны 3 похожих вопроса, но у них обоих нет рабочего решения:
- UIWebView прокручивает вяло - частные вызовы API, такие как
-(void)_setDrawInWebThread:(BOOL)arg1
а также-(void)_setDrawsCheckededPattern:(BOOL)arg1
предлагаются, и мы знаем, что они не разрешены в приложениях App Store - Как получить быструю, плавную прокрутку с UIWebView? - кто-то говорил о CATiledLayer, но не было четкого указателя на то, как это реализовать.
- Реализация CATiledLayer на UIWebView для быстрой прокрутки - Брэд Ларсон сказал, что "нет способа вручную создать резервную копию UIWebView с помощью CATiledLayer из-за его сложной архитектуры рендеринга".
Интересно, есть ли какие-либо решения этой проблемы. Любые предложения приветствуются.
3 ответа
Боюсь, что нет. Большие сайты остаются большими и, следовательно, потребляют много памяти.
Я бы поспорил против Брэда Ларсона: технически возможно создать веб-представление в собственном CATiledLayer (просто [webView.layer renderInContext: ]
) но не имеет большого смысла. Плиточные слои загружаются лениво, как и веб-представления. Вам понадобится огромное количество точно настроенного кода, чтобы определить, когда страница закончила загрузку, затем кэшировать вещи в свой плиточный слой и так далее.
Несмотря на это, веб-просмотр на самом деле довольно оптимизирован. Я бы даже сказал, что это одна из самых оптимизированных вещей во всей iOS. Это наиболее часто используемый компонент, критичный к производительности, на всей платформе. Каждый многострочный текст является веб-представлением (например, UITextView реализован с использованием их). Если веб-просмотр не работает на каком-либо веб-сайте, вам будет довольно сложно сделать его быстрее.
Есть случаи, когда другое решение может также работать, но только если вы ищете что-то особенное. Если нет, то оставьте свои руки подальше и потратьте время в другом месте. Просто мои 2 цента...
Я действительно не знаю, может ли это помочь или является точным, учитывая вопрос, но вот что я должен сказать:
Некоторые свойства, такие как тень или градиент, и даже изображения внутри WebView сильно влияют на производительность, которую вы можете получить. Старайтесь не использовать их и / или сохранить их как можно меньше.
Некоторые приложения веб-браузера, такие как iCab и Atomic Web Browser, по-видимому, используют метод _setDrawInWebThread: и, очевидно, они разрешены в магазине приложений. Если они не используют этот метод, то они используют что-то, что идентично этому, для их UIWebView. Кто-нибудь знает наверняка, Apple отклоняет приложения, которые используют этот частный API? Могут ли они позволить этому пройти "молча"? Я удивлен, что Apple до сих пор не сделала этот API общедоступным, потому что любое приложение, которое использует UIWebView для отображения веб-страницы (и есть много приложений с высоким профилем, которые делают это, например, FlipBoard), делает устройство "нестабильным". и подпаритет, выполняющий...