我們經常會遇到需要做無限輪播Banner的需求,仔細分析一下,可以拆分為兩個需求:
- 可以自動滾動到下一頁
- 不管是向前或者向后悯舟,永遠有下一頁
需求一:自動滾動
原理:通過定時任務來實現(xiàn)自動滾動
實現(xiàn)方式有很多種笛谦,例如GCD,NSTimer等蜒谤,具體實現(xiàn)方式這里不展開說明了,簡單寫幾個例子:
GCD的使用
// GCD實現(xiàn)定時任務
dispatch_source_t timer;
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
dispatch_source_set_timer(timer,
dispatch_time(DISPATCH_TIME_NOW, 5*NSEC_PER_SEC),
5*NSEC_PER_SEC,
0);
dispatch_source_set_event_handler(timer, ^{
dispatch_suspend(timer);
});
dispatch_resume(timer);
NSTimer的使用
// NSTimer
- (void)startTimer {
[self stopTimer];
self.repeatTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(scrollToNextPage) userInfo:nil repeats:YES];
}
- (void)stopTimer {
[self.repeatTimer invalidate];
self.repeatTimer = nil;
}
- (void)scrollToNextPage {
// scroll to next page
}
需求二:永遠有上一頁/下一頁
網上比較常見的有兩種方案:
1、UICollectionView
為CollectionView返回一個比較大的itemCount嫉称,然后通過取余計算來實現(xiàn)cell的循環(huán)展示
為實現(xiàn)假的可以無限上下滾動,所以會將初始化的位置放到itemCount的中間位置
優(yōu)點:可以比較流暢的上下滾動
缺點:有邊界灵疮,假無限(可以通過返回更大的itemCount來優(yōu)化织阅,由于collectionView的重用機制,并不會過多消耗內存)震捣,如果真到邊界時荔棉,需要復位闹炉,否則會卡住
綜上,推薦使用這種方式來實現(xiàn)润樱,設置一個比較大的itemCount之后渣触,只要不是雞蛋里挑骨頭,可以說是“無限”循環(huán)
2壹若、UIScrollView
使用UIScrollView又有兩種思路:
具體實現(xiàn)請參考http://www.reibang.com/p/5847021bebc2
①滾動后重新布局嗅钻,然后滾動到中間位置
-
定義≥3頁的內容
1 -
滾動到中間+1頁
2 -
后臺修改頁面內容,滾動到中間頁(無動畫)
3
②滾動動畫完成后店展,調整到合適的位置
滑到左邊圖3后啊犬,后臺滾動到右邊圖3位置
滑到右邊圖0時,后臺滾動到左邊圖0位置
image.png
優(yōu)點:真的可以無限滑動
缺點:滑動不松手的話壁查,會有邊界