iOS6 UICollectionView和UIPageControl - 如何获取可见单元格?

gaz*_*ola 36 objective-c ios ios6

在研究iOS6的新功能时,我遇到了一个关于UICollectionView的问题.
我目前正在使用Flow布局测试它,滚动方向设置为水平,滚动和分页启用.我将其大小设置为与我的自定义单元格完全相同,因此它可以一次显示一个,并通过向侧面滚动,用户将看到其他现有单元格.

它完美地运作.

现在我想将UIPageControl添加到我创建的集合视图中,这样就可以显示哪个单元格可见以及有多少单元格.

构建页面控件非常简单,定义了frame和numberOfPages.

我所遇到的问题,如问题标题,是如何在集合视图中获取当前可见的单元格,因此它可以更改页面控件的currentPage.

我已经尝试过委托方法,比如cellForItemAtIndexPath,但它是为了加载单元格而不是显示它们.当一个单元格不再显示时,didEndDisplayingCell触发,这是我需要的相反事件.

它似乎-visibleCells和-indexPathsForVisibleItems,集合视图方法,对我来说是正确的选择,但我碰到了另一个问题.什么时候触发它们?

在此先感谢,希望我能让自己清楚明白,这样你们才能理解我!

Sen*_*doa 91

你必须自己设置UIScrollViewDelegate并实现这样的scrollViewDidEndDecelerating:方法:

Objective-C的

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.collectionView.frame.size.width;
    self.pageControl.currentPage = self.collectionView.contentOffset.x / pageWidth;
}
Run Code Online (Sandbox Code Playgroud)

迅速

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

    let pageWidth = self.collectionView.frame.size.width
    pageControl.currentPage = Int(self.collectionView.contentOffset.x / pageWidth)
}
Run Code Online (Sandbox Code Playgroud)

  • 无需为CollectionView创建IVAR:` - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView {CGFloat pageWidth = _tutorialCollectionViewFrame.size.width; _pageControl.currentPage = scrollView.contentOffset.x/pageWidth; }` (2认同)

小智 18

我也挣扎了一段时间,然后建议我查看UICollectionView的父类.其中一个恰好是UIScrollView,如果你把自己设置为UIScrollViewDelegate,你可以访问非常有用的方法,例如scrollViewDidEndDecelerating,这是一个更新UIPageControl的好地方.


Nik*_*kov 17

我建议稍微调整一下计算和处理,因为它会在任何滚动位置立即更新页面控制,并且准确性更高.

下面的解决方案适用于任何滚动视图或它的子类(UITableView UICollectionView和其他)

在viewDidLoad方法中写这个

scrollView.delegate = self
Run Code Online (Sandbox Code Playgroud)

然后使用您的语言代码:

斯威夫特3

func scrollViewDidScroll(_ scrollView: UIScrollView) 
    {
       let pageWidth = scrollView.frame.width
       pageControl.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
    }
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

func scrollViewDidScroll(scrollView: UIScrollView) 
{
   let pageWidth = CGRectGetWidth(scrollView.frame)
   pageControl.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
}
Run Code Online (Sandbox Code Playgroud)

目标C.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.collectionView.frame.size.width;
    self.pageControl.currentPage = (self.collectionView.contentOffset.x + pageWidth / 2) / pageWidth;
}
Run Code Online (Sandbox Code Playgroud)


Ram*_*esh 8

使用较少代码的另一个选项是使用可见项索引路径并设置页面控件.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    self.pageControl.currentPage = [[[self.collectionView indexPathsForVisibleItems] firstObject] row];
}
Run Code Online (Sandbox Code Playgroud)


Ram*_*has 5

  1. PageControl放在视图中或按代码设置.
  2. 设置UIScrollViewDelegate
  3. Collectionview - > cellForItemAtIndexPath(Method)中添加以下代码来计算页数,

int pages = floor(ImageCollectionView.contentSize.width/ImageCollectionView.frame.size.width); [pageControl setNumberOfPages:pages];

添加ScrollView Delegate方法,

pragma mark - UIPcrollVewDelegate for UIPageControl

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

    if (0.0f != fmodf(currentPage, 1.0f))
    {
        pageControl.currentPage = currentPage + 1;
    }
    else
    {
        pageControl.currentPage = currentPage;
    }
    NSLog(@"finishPage: %ld", (long)pageControl.currentPage);
}
Run Code Online (Sandbox Code Playgroud)