Ленивая загрузка страниц в UIScrollView - PullRequest
7 голосов
/ 04 апреля 2010

У меня есть UIScrollView, который содержит большие изображения, и я использую пейджинг для прокрутки между изображениями. Для экономии памяти я загружаю только одно изображение до и после видимого в данный момент изображения и загружаю / выпускаю новые изображения после завершения прокрутки.

Проблема возникает, когда прокручивается быстро, а scrollViewDidEndDecelerating не вызывается.

Как я могу обнаружить непрерывную прокрутку?

Я мог бы проверить местоположение предмета на каждом scrollViewDidScroll, но это кажется немного тяжелым ...

Ответы [ 7 ]

2 голосов
/ 12 апреля 2011

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

0 голосов
/ 09 января 2012

WWDC 2010 говорил об этом. Они выполняют повторное использование представлений прокрутки, выделяют представление отсутствующего изображения в scrollViewDidScroll: . Видео может помочь:

Сессия 104 - Разработка приложений с использованием прокрутки

0 голосов
/ 17 мая 2011

Согласно моему опыту, @ jd291 верен; Я успешно использую следующие обратные вызовы для большинства мест

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

но единственный случай, когда callback не вызывается, это то, что вы, возможно, неправильно настроили delegate.

0 голосов
/ 30 апреля 2011

Необходимо проверить как scrollViewDidEndDecelerating, так и scrollViewDidScroll. Когда пользователь проводит пальцем по экрану и отпускает его, позволяя прокручивать «импульс», первый будет вызван в и. Если пользователь решает остановить прокрутку пальцем, нажав на вид таблицы (или прокрутка доходит до самого дна, но я не уверен в этом), запускается второе событие.

0 голосов
/ 20 мая 2010

, если вы все еще ищете решение ... это то, что я делаю, оно действительно хорошо работает, имея хорошую производительность.

- (void)scrollViewDidEndDragging:(UIScrollView *)sv willDecelerate:(BOOL)decelerate
{
    if (!decelerate)
    {
        // load images and unload the ones that are not needed anymore
        [self someMethod]
    }
}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv
{
    // load images and unload the ones that are not needed anymore
    [self someMethod]
}
0 голосов
/ 08 апреля 2010

Вы можете сделать что-то вроде этого

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 1.5) / pageWidth) + 1;
}

этот метод вызывается каждый раз, когда смещение содержимого изменяется программно или нет.

С помощью этого метода вы можете проверить, совпадает ли 'page' с вашей текущей страницей, если нет, вы знаете, что вам нужно что-то загрузить Хитрость здесь в том, чтобы загружать изображения, не удерживая прокрутку прокрутки. Вот где я застрял.

расчет страницы изменится на следующий / предыдущий, когда вы на полпути к следующей странице

0 голосов
/ 04 апреля 2010

Мое временное решение - отменить непрерывную прокрутку, отключив прокрутку с момента, когда пользователь поднимает палец, до завершения прокрутки.

-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    [scrollView setScrollEnabled:NO];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [scrollView setScrollEnabled:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...