Могу ли я поддерживать плавную прокрутку при загрузке HTML в дочерний UIWebView?

Мне нужно показать слайд-шоу с разбивкой на страницы HTML-страниц с умеренной нагрузкой на DOM в приложении для iPad.
Все документы адаптированы для экрана iPad, поэтому внутри UIWebViews нет прокрутки.

Я решил поместить UIWebView внутри UIScrollView для нумерации страниц.
Это работает очень хорошо и плавно после того, как все веб-представления отобразили свое содержимое.

Однако я не могу позволить себе ждать, пока загрузится 20, 30 или 50 веб-просмотров, прежде чем пользователь сможет прокручивать: это занимает минуты.
Я попытался предвидеть пролистывания в обработчике scrollViewDidScroll и предварительно загрузить несколько следующих страниц, поскольку пользователь продолжает прокручивать.

Это работало намного лучше (нет разницы в производительности между 10 и 150 веб-просмотрами).
Однако вызов loadHTMLString в обработчике scrollViewDidScroll приводит к тому, что прокрутка теряет плавность.

Меня не волнует, потребуется ли на секунду больше времени, чтобы показать конкретный UIWebView — все, что я хочу, — это сделать прокрутку плавной и доступной как можно скорее, а также лениво предварительно загружать UIWebView на ходу.

Как мне этого добиться?


person Dan Abramov    schedule 16.07.2012    source источник


Ответы (1)


Это сложная проблема, и нет простого/элегантного способа ее решения.

Один из способов ускорить прокрутку — ленивая загрузка страниц, как вы указали в своем вопросе. Однако для обеспечения плавности вам придется контролировать, когда происходит загрузка.

Допустим, вы начали с загрузки первых 5 страниц при первом запуске. Когда пользователь прокручивает до страницы 2 и ОСТАНАВЛИВАЕТСЯ, вы начинаете загрузку страницы 6. Как только пользователь снова начинает прокручивать, вы приостанавливаете загрузку, чтобы возобновить ее, когда он остановился на новой странице. Приостановка загрузки между ними поможет сгладить прокрутку. Кроме того, убедитесь, что вы публикуете данные, когда это возможно, потому что они могут накапливаться и мешать плавной прокрутке вниз по строке.

Другим вариантом было бы начать загрузку UIWebViews только после того, как пользователь остановится на странице. Итак, скажем, я прокручиваю страницу до, как только прокрутка останавливается, я начинаю загружать HTML. Это не так «красиво», как первые варианты, но гарантирует плавность прокрутки.

Другой вариант, этот немного необычный, - запустить и загрузить все HTML-страницы с форматированным текстом. Опуская все интенсивные вещи DOM. Затем сделайте снимок экрана с полузагруженной страницей programmaticall">используя этот метод. Когда пользователь останавливается на странице, вы загружаете ее полностью, включая интенсивный материал DOM. Это позволит пользователю почувствовать, что он быстро прокручивает все, что загружено.

Вот отличный класс прокрутки, который я использовал раньше.

Вот код, который поможет с методом 3.

Удачи, и я надеюсь, что это поможет!

РЕДАКТИРОВАТЬ: Вот отличный пост от ребят из LinkedIn. о том, как они решили проблемы с прокруткой webView. Стоит прочитать.

person random    schedule 16.07.2012
comment
Спасибо за ваше время. Я не знал, что могу отменить загрузку HTML. Я попробую это сейчас. - person Dan Abramov; 16.07.2012
comment
Я только что попытался вызвать stopLoading, когда пользователь начинает перетаскивание, и, хотя он стал заметно лучше, он все еще очень далек от безупречности. Проблема проявляется, когда пользователь прокручивает сразу после того, как мы считаем, что загрузка контента безопасна. Событие прокрутки ставится в очередь, и у нас нет возможности узнать о намерении пользователя выполнить прокрутку до завершения загрузки. - person Dan Abramov; 17.07.2012
comment
Хм, это раздражает: P Я не уверен, что понял последнюю часть вашего комментария. Не могли бы вы объяснить это подробнее? Прошу прощения, сегодня я медлительный. - person random; 24.07.2012