最近閑來無事,封裝了一個(gè)無限圖片輪播器,基于collectionView完成,抽取了兩個(gè)API,一個(gè)是創(chuàng)建輪播器,一個(gè)是點(diǎn)擊圖片的跳轉(zhuǎn),使用的話,直接把JZLCycleView這個(gè)文件夾拖進(jìn)項(xiàng)目,調(diào)用API就完成了,非常簡單
更新:
2016.12.21 解決控制器被銷毀時(shí),timer不被釋放造成的內(nèi)存泄漏
1.無限輪播思路:
建了圖片數(shù)量*3個(gè)數(shù)的cell,然后去一直顯示中間的cell,到最后一組的第一個(gè),無動(dòng)畫滾動(dòng)到中間一組的第一個(gè),到第一組的最后一個(gè),無動(dòng)畫滾動(dòng)到中間一組的最后一個(gè)
2.調(diào)用的方法,使用直接調(diào)用API
_cycleView = [JZLCycleView cycleCollectionViewWithFrame:CGRectMake(0, 0, JZLScreenWidth, JZLCycleViewHeight) imageArray:arrTemp PlaceholderImage:[UIImage imageNamed:@"placeholderImage"]];
//小圓點(diǎn)顏色設(shè)置,自己根據(jù)需求更改,默認(rèn)黑色和白色
_cycleView.pageControl.pageIndicatorTintColor = [UIColor orangeColor];
_cycleView.pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];
//如果要跳轉(zhuǎn)記得遵守協(xié)議,設(shè)置代理
_cycleView.delegate = self;
_cycleView.clickItemBlock = ^(NSInteger index){
NSLog(@"%ld",(long)index);
};
[self.view addSubview:_cycleView];
2.1跳轉(zhuǎn)這一塊封裝了兩個(gè),一個(gè)block,一個(gè)代理,個(gè)人認(rèn)為代理更清晰一些
//block跳轉(zhuǎn)
_cycleView.clickItemBlock = ^(NSInteger index){
NSLog(@"%ld",(long)index);
};
//代理跳轉(zhuǎn)
- (void)selectItemAtIndex:(NSInteger)index {
NSLog(@"%ld",index);
}
3.實(shí)現(xiàn)
1.初始化輪播器,這里抽取了兩個(gè),一個(gè)是加載本地圖片,一個(gè)是加載網(wǎng)路url,一般開發(fā)中第二個(gè)用的比較多
/**
初始化實(shí)例
@param frame 圖片輪播器frame
@param imageArray 本地圖片數(shù)組(可傳圖片url和本地圖片,自動(dòng)判斷)
@param placeholderImage 占位圖
@return 圖片輪播器
*/
+ (instancetype)cycleCollectionViewWithFrame: (CGRect)frame imageArray: (NSArray *)imageArray PlaceholderImage: (UIImage *)placeholderImage;
2.主要的就是去完成collectionView
//設(shè)置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)];
//默認(rèn)一張,加載圖片后自動(dòng)更新
self.pageControl.numberOfPages = 1;
self.pageControl.currentPage = 0;
[self addSubview:self.pageControl];
}
3.添加定時(shí)器以及手動(dòng)滾動(dòng)和自動(dòng)滾動(dòng)的切換
//設(shè)置頁碼
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.pageControl.currentPage = (NSInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width)%self.imageArray.count;
}
//添加定時(shí)器
- (void)addTimer {
self.timer = [NSTimer scheduledTimerWithTimeInterval:automaticTime target:self selector:@selector(automaticScrollCollectionCell) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
//刪除定時(shí)器
- (void)deleteTimer {
[self.timer invalidate];
self.timer = nil;
}
//自動(dòng)滾動(dòng)
- (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 ;
}
}
//手動(dòng)滾動(dòng)時(shí)刪除定時(shí)器
- (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];
}
}
}
//停止?jié)L動(dòng)時(shí)打開定時(shí)器
- (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的話報(bào)錯(cuò)記得icocoaPods里面install一下,如果大家發(fā)現(xiàn)有崩潰或者問題,請留言,謝謝