我們經(jīng)常會(huì)遇到需要做無(wú)限輪播Banner的需求,仔細(xì)分析一下,可以拆分為兩個(gè)需求:
- 可以自動(dòng)滾動(dòng)到下一頁(yè)
- 不管是向前或者向后,永遠(yuǎn)有下一頁(yè)
需求一:自動(dòng)滾動(dòng)
原理:通過定時(shí)任務(wù)來實(shí)現(xiàn)自動(dòng)滾動(dòng)
實(shí)現(xiàn)方式有很多種,例如GCD,NSTimer等,具體實(shí)現(xiàn)方式這里不展開說明了,簡(jiǎn)單寫幾個(gè)例子:
GCD的使用
// GCD實(shí)現(xiàn)定時(shí)任務(wù)
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
}
需求二:永遠(yuǎn)有上一頁(yè)/下一頁(yè)
網(wǎng)上比較常見的有兩種方案:
1、UICollectionView
為CollectionView返回一個(gè)比較大的itemCount,然后通過取余計(jì)算來實(shí)現(xiàn)cell的循環(huán)展示
為實(shí)現(xiàn)假的可以無(wú)限上下滾動(dòng),所以會(huì)將初始化的位置放到itemCount的中間位置
優(yōu)點(diǎn):可以比較流暢的上下滾動(dòng)
缺點(diǎn):有邊界,假無(wú)限(可以通過返回更大的itemCount來優(yōu)化,由于collectionView的重用機(jī)制,并不會(huì)過多消耗內(nèi)存),如果真到邊界時(shí),需要復(fù)位,否則會(huì)卡住
綜上,推薦使用這種方式來實(shí)現(xiàn),設(shè)置一個(gè)比較大的itemCount之后,只要不是雞蛋里挑骨頭,可以說是“無(wú)限”循環(huán)
2、UIScrollView
使用UIScrollView又有兩種思路:
具體實(shí)現(xiàn)請(qǐng)參考http://www.itdecent.cn/p/5847021bebc2
①滾動(dòng)后重新布局,然后滾動(dòng)到中間位置
-
定義≥3頁(yè)的內(nèi)容
1 -
滾動(dòng)到中間+1頁(yè)
2 -
后臺(tái)修改頁(yè)面內(nèi)容,滾動(dòng)到中間頁(yè)(無(wú)動(dòng)畫)
3
②滾動(dòng)動(dòng)畫完成后,調(diào)整到合適的位置
滑到左邊圖3后,后臺(tái)滾動(dòng)到右邊圖3位置
滑到右邊圖0時(shí),后臺(tái)滾動(dòng)到左邊圖0位置
image.png
優(yōu)點(diǎn):真的可以無(wú)限滑動(dòng)
缺點(diǎn):滑動(dòng)不松手的話,會(huì)有邊界



