iOS無(wú)限輪播Banner案例與原理分析

我們經(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)到中間位置

  1. 定義≥3頁(yè)的內(nèi)容


    1
  2. 滾動(dòng)到中間+1頁(yè)


    2
  3. 后臺(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ì)有邊界

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Bg:圖片輪播器數(shù)不勝數(shù),但大多是UIScrollView + OC實(shí)現(xiàn)的,心血來潮,決定用Swift+UICol...
    星辰大海_王閱讀 3,394評(píng)論 3 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 最近心情一直不好,壓力大,老公孩子覺得沒有一個(gè)省心,孩子成績(jī)下滑,學(xué)習(xí)始終不專心,且跟小伙伴在一塊時(shí)常發(fā)點(diǎn)小情緒,...
    加油淡然閱讀 200評(píng)論 0 1
  • 公司:路易彬彥 【日精進(jìn)打卡第172天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》1遍共148遍 《大學(xué)》0遍共57遍 《通篇》...
    路易彬彥張娟閱讀 159評(píng)論 0 0

友情鏈接更多精彩內(nèi)容