最近閑來無事,封裝了一個無限圖片輪播器,基于collectionView完成,抽取了兩個API,一個是創建輪播器,一個是點擊圖片的跳轉,使用的話,直接把JZLCycleView這個文件夾拖進項目,調用API就完成了,非常簡單
更新:
2016.12.21 解決控制器被銷毀時,timer不被釋放造成的內存泄漏
1.無限輪播思路:
建了圖片數量*3個數的cell,然后去一直顯示中間的cell,到最后一組的第一個,無動畫滾動到中間一組的第一個,到第一組的最后一個,無動畫滾動到中間一組的最后一個
2.調用的方法,使用直接調用API
_cycleView = [JZLCycleView cycleCollectionViewWithFrame:CGRectMake(0, 0, JZLScreenWidth, JZLCycleViewHeight) imageArray:arrTemp PlaceholderImage:[UIImage imageNamed:@"placeholderImage"]];
//小圓點顏色設置,自己根據需求更改,默認黑色和白色
_cycleView.pageControl.pageIndicatorTintColor = [UIColor orangeColor];
_cycleView.pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];
//如果要跳轉記得遵守協議,設置代理
_cycleView.delegate = self;
_cycleView.clickItemBlock = ^(NSInteger index){
NSLog(@"%ld",(long)index);
};
[self.view addSubview:_cycleView];
2.1跳轉這一塊封裝了兩個,一個block,一個代理,個人認為代理更清晰一些
//block跳轉
_cycleView.clickItemBlock = ^(NSInteger index){
NSLog(@"%ld",(long)index);
};
//代理跳轉
- (void)selectItemAtIndex:(NSInteger)index {
NSLog(@"%ld",index);
}
3.實現
1.初始化輪播器,這里抽取了兩個,一個是加載本地圖片,一個是加載網路url,一般開發中第二個用的比較多
/**
初始化實例
@param frame 圖片輪播器frame
@param imageArray 本地圖片數組(可傳圖片url和本地圖片,自動判斷)
@param placeholderImage 占位圖
@return 圖片輪播器
*/
+ (instancetype)cycleCollectionViewWithFrame: (CGRect)frame imageArray: (NSArray *)imageArray PlaceholderImage: (UIImage *)placeholderImage;
2.主要的就是去完成collectionView
//設置collectionView
- (void)setupCollcetionView {
//collcetionView
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:flowLayout];
flowLayout.itemSize = CGSizeMake(self.bounds.size.width, self.bounds.size.height);
flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
flowLayout.minimumLineSpacing = 0;
collectionView.pagingEnabled = YES;
collectionView.bounces = NO;
collectionView.showsHorizontalScrollIndicator = NO;
collectionView.delegate = self;
collectionView.dataSource = self;
[collectionView registerClass:[JZLCollectionViewCell class] forCellWithReuseIdentifier: reuseID];
[self addSubview:collectionView];
self.collectionView = collectionView;
//pageControl
self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(self.bounds.size.width / 2 - 50, self.bounds.size.height - 20, 100, 20)];
//默認一張,加載圖片后自動更新
self.pageControl.numberOfPages = 1;
self.pageControl.currentPage = 0;
[self addSubview:self.pageControl];
}
3.添加定時器以及手動滾動和自動滾動的切換
//設置頁碼
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.pageControl.currentPage = (NSInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width)%self.imageArray.count;
}
//添加定時器
- (void)addTimer {
self.timer = [NSTimer scheduledTimerWithTimeInterval:automaticTime target:self selector:@selector(automaticScrollCollectionCell) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
//刪除定時器
- (void)deleteTimer {
[self.timer invalidate];
self.timer = nil;
}
//自動滾動
- (void)automaticScrollCollectionCell {
self.index++;
if (self.imageArray.count == 0) {
return;
}else {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.index inSection:0];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:0 animated:YES];
if (indexPath.row == self.imageArray.count * 2) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.imageArray.count inSection:0];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:0 animated:NO];
});
}
self.pageControl.currentPage = self.index % self.imageArray.count ;
}
}
//手動滾動時刪除定時器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[self deleteTimer];
if (self.imageArray.count == 0) {
return;
}else {
if (self.index == self.imageArray.count - 1) {
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:self.imageArray.count * 2 - 1 inSection:0] atScrollPosition:0 animated:NO];
}
if (self.index == self.imageArray.count * 2) {
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:self.imageArray.count inSection:0] atScrollPosition:0 animated:NO];
}
}
}
//停止滾動時打開定時器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[self addTimer];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
self.index = (NSInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width);
}
git地址:https://github.com/allenjzl/JZLCycleView.git
swift版本:https://github.com/allenjzl/JZLCycleView_Swift.git
下載圖片用了sdwebImage,demo的話報錯記得icocoaPods里面install一下,如果大家發現有崩潰或者問題,請留言,謝謝