UICollectionView Auto Scroll Paging

匆匆过客 提交于 2019-12-09 07:14:27

问题


my project have a UIcollectionView. This Horizontal paging and have four object. i’m want my collectionView Auto Scroll Paging. which use methods?


回答1:


As for theory, I just explain the key point. For example, if you want to auto-cycle display 5 images in somewhere, just as ads bar. You can create a UICollectionView with 100 sections, and there're 5 items in every section. After creating UICollectionView, set its original position is equal to the 50th section 0th item(middle of MaxSections ) so that you can scroll to left or right. Don't worry it will ends, because I have reset the position equal to middle of MaxSections when the Timer runs. Never argue with me :" it also will ends when the user keep scrolling by himself" If one find there're only 5 images, will he keep scrolling!? I believe there is few such silly user in this world!

Note: In the following codes,the headerView is UICollectionView,headerNews is data. And I suggest set MaxSections = 100.

Add a NSTimer after custom collectionView(Ensure the UICollectionViewFlowLayout is properly set at first):

    - (void)addTimer
    {
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
        [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
        self.timer = timer;

}

then implement @selector(nextPage):

 - (void)nextPage
{
    // 1.back to the middle of sections
    NSIndexPath *currentIndexPathReset = [self resetIndexPath];

    // 2.next position 
    NSInteger nextItem = currentIndexPathReset.item + 1;
    NSInteger nextSection = currentIndexPathReset.section;
    if (nextItem == self.headerNews.count) {
        nextItem = 0;
        nextSection++;
    }
    NSIndexPath *nextIndexPath = [NSIndexPath indexPathForItem:nextItem inSection:nextSection];

    // 3.scroll to next position
    [self.headerView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];
}

last implement resetIndexPath method:

- (NSIndexPath *)resetIndexPath
{
    // currentIndexPath
    NSIndexPath *currentIndexPath = [[self.headerView indexPathsForVisibleItems] lastObject];
    // back to the middle of sections
    NSIndexPath *currentIndexPathReset = [NSIndexPath indexPathForItem:currentIndexPath.item inSection:MaxSections / 2];
    [self.headerView scrollToItemAtIndexPath:currentIndexPathReset atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
    return currentIndexPathReset;
}

In order to control NSTimer , you have to implement some other methods and UIScrollView's delegate methods:

- (void)removeTimer
{
    // stop NSTimer 
    [self.timer invalidate];
   // clear NSTimer
    self.timer = nil;
}

// UIScrollView' delegate method
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
        [self removeTimer];
}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
        [self addTimer];

}



回答2:


Swift 2.0 version for @Elijah_Lam 's answer:

  func addTimer()
  {
    timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "nextPage", userInfo: nil, repeats: true)
    NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
  }

  func nextPage()
  {
    var ar = cvImg.indexPathsForVisibleItems()

    ///indexPathsForVisibleItems()'s result is not sorted. Sort it by myself...
    ar = ar.sort{if($0.section < $1.section)
      {
      return true
      }
      else if($0.section > $1.section)
    {
      return false
    }
      ///in same section, compare the item
      else if($0.item < $1.item)
      {
        return true
      }
      return false
    }


    var currentIndexPathReset = ar[1]
    if(currentIndexPathReset.section > MaxSections)
    {
      currentIndexPathReset = NSIndexPath(forItem:0, inSection:0)
    }

    cvImg.scrollToItemAtIndexPath(currentIndexPathReset, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
  }

  func removeTimer()
  {
    // stop NSTimer
    timer.invalidate()
  }

  // UIScrollView' delegate method
  func scrollViewWillBeginDragging(scrollView: UIScrollView)
  {
    removeTimer()
  }


  func scrollViewDidEndDragging(scrollView: UIScrollView,
    willDecelerate decelerate: Bool)
  {
    addTimer()
  }


来源:https://stackoverflow.com/questions/26842897/uicollectionview-auto-scroll-paging

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!