scrollViewDidEndDecelerating не вызывается

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

Как мне это решить? Почему это происходит?


person spd    schedule 17.03.2011    source источник
comment
Как вы реализуете прокрутку, если не меняете смещения? Я делал это несколько раз в разных приложениях, и все, что вы описываете, может быть достигнуто с помощью обычного подхода (scrollRectToVisible) и просто разумного включения/отключения части анимации в зависимости от эффекта, которого вы хотите достичь. Похоже, вы делаете что-то очень необычное здесь?   -  person Adam    schedule 20.03.2011
comment
У вас есть ответ на этот вопрос, у меня такая же проблема...   -  person Naveen kumar    schedule 27.07.2015


Ответы (5)


scrollViewDidEndDragging будет вызываться после завершения каждой прокрутки

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{}

scrollViewDidEndDecelerating не вызывается при каждом перетаскивании (если вы не перетаскиваете с ускорением после остановки перетаскивания, эта функция никогда не будет вызываться)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}

scrollViewDidEndScrollingAnimation, если вы хотите переместить вид прокрутки, используйте API без перетаскивания, будет вызван этот API.

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{}
person zszen    schedule 17.10.2017

Я делаю то же самое с просмотром прокрутки - ленивая загрузка изображений. На самом деле нам пришлось загрузить растянутую миниатюру (создав размытую версию изображения с низким разрешением), а затем загрузить реальное изображение, когда страница фактически отображается на 100% в поле зрения.

Что мне нужно было сделать, так это использовать следующий код в файле scrollViewDidScroll:scrollView.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{    
    if (!_isCurrentlyRotating) {
        CGFloat pageWidth = _scrollView.frame.size.width;
        int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth)+1;

        if (_currentPage != page)
            [self setCurrentPage:page];
    }
}

Приведенное выше вычисляет страницу, которая будет отображаться (как ваша прокрутка). Это фактически изменит текущий номер страницы, когда просмотр страницы отображается на 50%. Это можно использовать в сочетании с элементом управления страницей, чтобы выделить точку текущей страницы.

Используя приведенное выше (с включенным пейджингом в режиме прокрутки), когда пользователь использует свой палец для изменения страницы (нормальное поведение), scrollViewDidEndDecelerating:scrollView вызывается, когда страница отображается на 100%. Под 100% я подразумеваю, что вы можете видеть только одну страницу, а не часть одной части другой.

Но у нас есть кнопка «Начать сначала» в конце прокрутки, которая вызывает мою функцию scrollToPage:.

- (void) scrollToPage:(int)page {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * page;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    [self.scrollView scrollRectToVisible:frame animated:YES];
}

Использование метода scrollRectToVisible:animated: не запускает метод scrollViewDidEndDecelerating:, поэтому я просто добавил вызов метода резкости (который просто загружает изображение с высоким разрешением в представление изображения) к обоим методам, чтобы он вызывался, если пользователь прокручивает или если нажата кнопка начать заново.

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    [self sharpenImageView];
}

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self sharpenImageView];
}

Надеюсь, это поможет!

person RachelD    schedule 19.01.2012

Проверьте, установлен ли делегат вашего UIScrollView или нет, или он установлен на ноль.

Обычно устанавливается таким образом scrollView.delegate = self.

person William Hu    schedule 25.02.2019

scrollViewDidEndDecelerating: не предназначен для макета страницы. Вы должны реализовать scrollViewDidScroll: и вычислить текущую видимую страницу (страницы) на основе contentOffset представления прокрутки. Если видимый диапазон изменился, добавьте представления для страниц, которые ранее не были видны, и удалите те, которые больше не видны.

person omz    schedule 18.07.2011
comment
Это не помогло мне найти решение моей проблемы. - person spd; 19.07.2011

Иногда просто очистите свой проект и перезапустите

Shift и Cmd и K Shift и Cmd и Alt и k

person Ahmed Elashker    schedule 03.01.2017