Подтвердить что ты не робот

Обнаружить изменение страницы в UICollectionView

Я пытался найти этот вопрос некоторое время, но не смог найти ответ на эту проблему. Моя проблема в том, что у меня есть UICollectionView, а направление прокрутки Horizontal с Paging Enabled. Моя проблема заключается в том, что я хочу сохранить привязку к текущему номеру страницы, на котором находится пользователь, поэтому я создал переменную int и теперь хочу добавить или вычесть ее на 1 каждый раз, когда пользователь щелкает вправо или влево. Я попытался использовать делегат scrollView

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

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

4b9b3361

Ответ 1

Использование:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = collectionView.frame.size.width;
    float currentPage = collectionView.contentOffset.x / pageWidth;

    if (0.0f != fmodf(currentPage, 1.0f))
    {
        pageControl.currentPage = currentPage + 1;
    }
    else
    {
        pageControl.currentPage = currentPage;
    }

    NSLog(@"Page Number : %ld", (long)pageControl.currentPage);
}

И если вы не используете какой-либо pageControl, то ceil(currentPage) будет вашим текущим номером страницы.

Ответ 2

** Swift 3 XCODE 8.2 **

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x
        let w = scrollView.bounds.size.width
        let currentPage = Int(ceil(x/w))
        // Do whatever with currentPage.
}

Ответ 3

u может получить текущую страницу, как показано ниже, индекс будет от 0 до (total page - 1)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
 {
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    NSLog(@"Current page -> %d",page);
}

Ответ 4

Основываясь на ответе @Shankar BS, я реализовал его так, как в Swit. Имейте в виду, что CollectionViewDelegate соответствует ScrollViewDelegate:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let pageWidth = scrollView.frame.size.width
    let page = Int(floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
    print("page = \(page)")
}

Ответ 5

Swift 2.2

 func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let x = collectionView.contentOffset.x
    let w = collectionView.bounds.size.width
    let currentPage = Int(ceil(x/w))
    print("Current Page: \(currentPage)")
}