LWTViewController.m
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// // LWTViewController.m // 无限滚动 // // Created by apple on 14-7-30. // Copyright (c) 2014年 lwt. All rights reserved. // #import "LWTViewController.h" #import "LWTNews.h" #import "MJExtension.h" #import "LWTNewsCell.h" #define LWTCellIdentifier @"news" #define LWTMaxSection 100 @interface LWTViewController () <UICollectionViewDataSource, UICollectionViewDelegate> @property (weak, nonatomic) IBOutlet UICollectionView *collectionView; @property (nonatomic, strong) NSArray *newses; @property (nonatomic, weak) IBOutlet UIPageControl *pageContol; @property (nonatomic, strong) NSTimer *timer; @end @implementation LWTViewController -(NSArray *)newses { if (_newses == nil) { _newses = [LWTNews objectArrayWithFilename:@"newses.plist"]; self.pageContol.numberOfPages = self.newses.count; } return _newses; } - (void)viewDidLoad { [super viewDidLoad]; // 注册cell [self.collectionView registerNib:[UINib nibWithNibName:@"LWTNewsCell" bundle:nil] forCellWithReuseIdentifier:LWTCellIdentifier]; // 默认显示最中间的那组 [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:LWTMaxSection / 2] atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; // 添加定时器 [self addTimer]; } /** * 添加定时器 */ - (void)addTimer { NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; self.timer = timer; } /** * 移除定时器 */ - (void)stopTimer { [self.timer invalidate]; self.timer = nil; } - (NSIndexPath *)resetIndexPath { // 当前正在展示的位置 NSIndexPath *currentIndexPath = [[self.collectionView indexPathsForVisibleItems] lastObject]; // 马上显示回最中间那组的数据 NSIndexPath *currentIndexPathReset = [NSIndexPath indexPathForItem:currentIndexPath.item inSection:LWTMaxSection / 2]; [self.collectionView scrollToItemAtIndexPath:currentIndexPathReset atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; return currentIndexPathReset; } /** * 下一页 */ - (void)nextPage { // 1.马上显示回最中间那组的数据 NSIndexPath *indexPath = [self resetIndexPath]; // 2.计算出下一个需要展示的位置 NSInteger nextItem = indexPath.item + 1; NSInteger nextSection = indexPath.section; if (nextItem >= self.newses.count) { nextItem = 0; nextSection++; } // 3.通过动画滚动到下一个位置 [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:nextItem inSection:nextSection] atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; } #pragma mark - UICollectionViewDataSource - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return LWTMaxSection; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.newses.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { LWTNewsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:LWTCellIdentifier forIndexPath:indexPath]; cell.news = self.newses[indexPath.item]; return cell; } #pragma mark - UICollectionViewDelegate /** * 当用户即将开始拖拽的时候就调用 */ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self stopTimer]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { int page = (int)(scrollView.contentOffset.x / scrollView.bounds.size.width + 0.5) % self.newses.count; self.pageContol.currentPage = page; } /** * 当用户停止拖拽的时候就调用 */ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [self addTimer]; } @end