ios 中無限循環(huán)滾動簡單處理實(shí)現(xiàn)

1.說下原理:
1./*初始化/

+ (instancetype)loopScrollViewWithFrame:(CGRect)frame;
將背景collectinview視圖初始化設(shè)置 代理和數(shù)據(jù)源 、 布局

2.在激活initwithFrame后觸發(fā) layoutSubviews

 //默認(rèn)滾動到要顯示的第一張圖片
    if (self.imageCollectionView.contentOffset.x == 0) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:1 inSection:0];
        [self scrollToIndexPath:indexPath animated:NO];
        self.currentIndex = 1;
}

界面展示出來的時候默認(rèn) 顯示 真實(shí)下標(biāo)也就是從1開始

設(shè)置真實(shí)數(shù)據(jù)源 imageList ,然后展示 的 數(shù)據(jù)源是loopImageList 這里 呢 多出2個對象,0和末尾,設(shè)置時 最后 和 起始,setImageList如下

- (void)setImageList:(NSMutableArray *)imageList {
    _imageList = imageList;
    self.loopImageList = [NSMutableArray arrayWithArray:imageList];
    if (imageList.count>0) {
        [self.loopImageList insertObject:[imageList lastObject] atIndex:0];
        [self.loopImageList addObject:[imageList objectAtIndex:0]];
    }
}

核心代碼和思路

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat width = self.bounds.size.width;
    //在loopImageList中,有n+2個對象,因此index取offset.x/width后的整數(shù)
    NSInteger index = scrollView.contentOffset.x/width;
    //這個比值很重要
    CGFloat ratio = scrollView.contentOffset.x/width;
    
    //從顯示的最后一張往后滾,自動跳轉(zhuǎn)到顯示的第一張
    if (index == self.loopImageList.count-1) {
        self.currentIndex = 1;
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
        [self scrollToIndexPath:indexPath animated:NO];
        return;
    }
    
    //從顯示的第一張往前滾,自動跳轉(zhuǎn)到顯示的最后一張
    //這里判斷條件為contentOffset.x和寬的比值,在往前滾快要結(jié)束的時候,能達(dá)到無縫切換到顯示的最后一張的效果
    if (ratio <= 0.01) {
        self.currentIndex = self.imageList.count;
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
        [self scrollToIndexPath:indexPath animated:NO];
        return;
    }
    
    if (self.currentIndex != index) {
        self.currentIndex = index;
    }
    
    NSLog(@"currentIndex = %ld",self.currentIndex);
}

這里的原因是為什么呢?

  1. 這時候在圖滾動 執(zhí)行代理 監(jiān)聽的時候 ,我們的collectionview有設(shè)置 pageEnable 分頁屬性很關(guān)鍵有分頁動畫。
    當(dāng)偏移量判斷 真實(shí)的數(shù)據(jù)顯示到了最后一張。也就是8 滾到1的時候 ,設(shè)置回滾 ,回到默認(rèn)位置,且沒有動畫。

2.另外一步處理當(dāng)偏移量 小于 一個極小值 也就是 偏移即將到達(dá) 0 的是偶也就是 真實(shí)的第一張回滾到最后 一張的時候,設(shè)置默認(rèn)滾動到最后一張。

最重要的一點(diǎn) 這個黑科技 是使用scro 滾動到特定的item所以 在觸發(fā)的那一時刻,item就設(shè)定死了,scrollViewDidScroll:也就不會再滾動,因?yàn)楝F(xiàn)在的偏移量是一個唯一值。

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,041評論 25 709
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,153評論 1 92
  • 我不是一個“充滿激情的程序員”。我覺得,固定8小時工作之后,就應(yīng)該去做點(diǎn)別的事情,比如說看看科幻小說,和我親愛的妻...
    Bugtags閱讀 361評論 0 0
  • 在我今早繼續(xù)葛優(yōu)躺的時候,沈姑娘的一篇文章讓我立馬站起來打開電腦開始現(xiàn)在這博文。 對近期的狀態(tài)有了一個總結(jié),那就是...
    最好的十年里閱讀 256評論 0 0
  • 提起智能家居你是不是想到比爾蓋茨的豪宅,像這樣: 比爾蓋茨豪宅臥室 幕墻可隨入住人的喜好而顯示各種藝術(shù)作品或者 J...
    老七玉閱讀 204評論 0 0

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