【问题标题】:Detect page change in UICollectionView检测 UICollectionView 中的页面变化
【发布时间】:2015-04-08 06:42:28
【问题描述】:

我尝试寻找这个问题一段时间,但找不到这个问题的答案。 我的问题是我有一个UICollectionView,滚动方向是HorizontalPaging Enabled。我的问题是我想保留用户所在的当前页码,所以我创建了一个int 变量,现在希望每次用户向右或向左滑动时将其加或减 1。我尝试使用scrollView的代表

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

但是当用户向右或向左滑动时,它被调用的次数与UICollectionView 中页面上的列数一样多,而且它不会让我知道用户是转到下一页还是上一个。

【问题讨论】:

标签: ios objective-c iphone ios8


【解决方案1】:

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.
}

【讨论】:

  • 非常感谢。 :)
【解决方案2】:

使用:

- (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) 将是您当前的页码。

【讨论】:

  • 这完全可以根据需要工作,只是无法理解条件所以将它们更改为我自己的,但是有一个问题,这个方法是在UICollectionView- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath的代表之后调用的,但是我的页码ScrollView 的委托中的变量更改,因此它不能按需要工作,有什么解决方案吗?
  • 这是一个正常的行为,这个方法只会在你的collectionview滚动停止时触发..!!
  • 是的,你是对的.. 我会尝试为我的情况找到一些替代方案,但对于这个问题,这是完美的答案。感谢您的帮助。
  • 不幸的是不起作用。您还必须涵盖 scrollViewDidEndDragging 。 stackoverflow.com/a/59057080/294884
【解决方案3】:

根据@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)")
}

【讨论】:

    【解决方案4】:

    你可以像下面这样获取当前页面,索引将从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);
    }
    

    【讨论】:

    • 非常感谢.. :) 在UICollectionView's 委托- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 之前调用此方法有什么方法吗?
    【解决方案5】:

    SWIFT 5

    例如,将此方法放在您的 ViewController 中,扩展名为 UICollectionViewDelegate,UICollectionViewDataSource

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

    【讨论】:

    • 为您的答案添加一些解释或评论会更有帮助。
    【解决方案6】:

    斯威夫特 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)")
    }
    

    【讨论】:

    • 您应该添加一些上下文或评论,而不是仅发布代码作为答案。
    【解决方案7】:

    Xamarin.iOS:

    您可以覆盖UICollectionViewDelegateDecelerationEnded 方法或订阅UICollectionViewDecelerationEnded 事件(将在后台使用自定义委托)。

    public override void DecelerationEnded(UIScrollView scrollView)
    {
        var x = scrollView.ContentOffset.X;
        var w = scrollView.Bounds.Size.Width;
        var currentPage = Math.Ceiling(x / w);
    
        // use currentPage here
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多