Как определить, прокручивается ли страница или нет в ScrollView?

У меня есть ScrollView для отображения PDF-страниц. Когда я прокручиваю, это показывает мне вторую страницу с включенным пейджингом в ScrollView. Я установил свойство bounce false для прокрутки. Я хочу отобразить номер страницы, на которой отображается страница. Для этого я использовал следующий код.

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

if (scrollView == scrlView) {   
    if (lastContentOffsetX > scrollView.contentOffset.x) {

        if (currentPage > 1) {
            currentPage--;
            self.title = [NSString stringWithFormat:@"%d/%d", currentPage, totalPages];
        }
    }       
    else if (lastContentOffsetX < scrollView.contentOffset.x) {
        if (currentPage < totalPages) {
            currentPage++;
            self.title = [NSString stringWithFormat:@"%d/%d", currentPage, totalPages];
        }
    }
    lastContentOffsetX = scrollView.contentOffset.x;
}
}

У меня нет никаких проблем, если каждый раз, когда я перетаскиваю и страница меняется. Какое-то время я тащу совсем немного времени и страница не меняется и остается прежней. Номер моей страницы увеличивается/уменьшается.

Может ли кто-нибудь сказать мне, могу ли я получить какое-либо событие, когда ScrollView останавливает прокрутку? Я могу получить текущее смещение и выполнить свою задачу.


person Kapil Choubisa    schedule 18.03.2011    source источник


Ответы (3)


Пытаться

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

и/или

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
person Jilouc    schedule 18.03.2011

Вы меняете номер своей страницы каждый раз, когда пользователь перетаскивает прокрутку - просто используя тот факт, что перетаскивание произошло, вы предполагаете, что страница изменилась - это не всегда так. В вашем коде просто рассчитайте текущую страницу по смещению содержимого и ширине страницы. Таким образом, вы можете рассчитать текущий номер страницы (на основе 0):

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

   if (scrollView == scrlView) {   
       CGFloat xOffset = scrollView.contentOffset.x;
       int currentPage = floor(xOffset / scrollView.bounds.size.width);
       self.title = [NSString stringWithFormat:@"%d/%d", currentPage, totalPages];
   }
}

Также вы можете использовать неверный метод делегата - вместо этого я бы использовал метод scrollViewDidScroll:

P.S. чтобы показать номер страницы, которая в настоящее время занимает более половины экрана, измените код на:

int currentPage = floor(xOffset / scrollView.bounds.size.width + 0.5);
person Vladimir    schedule 18.03.2011
comment
Это тоже я могу использовать, но Jilouc более правильный. scrollViewDidScroll срабатывает несколько раз для одного эффекта прокрутки, поэтому его битовый процесс занимает. любая благодарность за помощь - person Kapil Choubisa; 18.03.2011

Вы можете использовать метод делегата UIScrollView.

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

См. документацию Справочник по протоколу UIScrollViewDelegate

person Adarsh V C    schedule 18.03.2011