UICollectionView實現(xiàn)無限輪播圖控件

UICollectionView是一個很棒的控件,今天用collectionview實現(xiàn)了一下輪播圖控件,主要記錄一下思路和一些比較小技巧吧,以便日后翻閱:
首先,基本思路是利用collectionview的本身的一些特性簡化我們,我們可以在在每一個cell上添加一個imgeview,將要輪播的圖片設(shè)置在每一個cell上,可以說基本功能就完成了,因為collectionview類似于uitableview,可以自由滾動,而且可以循環(huán)利用,到此一個基本的輪播圖控件就完成了。上面這些不再詳述,大家都懂,主要是說一下我們標(biāo)題所示的無限輪播
其實,我的實現(xiàn)方法是利用人的視覺差:
1、首先,根據(jù)拿到的圖片數(shù)組imgs,重新構(gòu)造一個圖片數(shù)組carouselImages,新數(shù)組的結(jié)構(gòu)是carouselImages = [imgs[lastObject],..imgs的所有元素...,imgs[0]],就是在imgs數(shù)組的最前面添加imgs的最后一個元素,在最后面添加imgs的第一個元素,構(gòu)成新數(shù)組carouselImages
2、然后利用新數(shù)組carouselImages來作為數(shù)據(jù)實現(xiàn)基本輪播功能
3、特殊處理
3.1讓collectionview默認(rèn)滾動到row = 1(其實就是我們要輪播的第一張圖片)可以在layoutsubviews中實現(xiàn)

    //默認(rèn)滾動到第一張圖片
    if (self.loop && self.carouselView.contentOffset.x == 0)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:1 inSection:0];
        [self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
        self.currentIndex = 1;
    }

3.2在- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法中在滾動到最后一張圖片時,繼續(xù)滾向后動跳到第一張,在當(dāng)滾動到第一張圖片時,繼續(xù)向前滾動跳到最后一張,而且不能有動畫。因為在前面我們重新構(gòu)造的新數(shù)組,當(dāng)滾動到最后一個圖片繼續(xù)滾動的時候,繼續(xù)滾動就會滾動出新添加的第一張圖片,此時,我們直接讓collectionview滾動到第一張圖片所在的cell,而且不能帶動畫,此時,圖片沒有變,但是collectionview已經(jīng)重新滾動到第一個cell,由于沒有動畫,我們基本感覺不出來collectionview的滾動,這樣就很自然的從最后一個cell滾動到第一個cell,從而實現(xiàn)了循環(huán),反向滾動思路一樣,利用在最前面添加的數(shù)組元素即可。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.loop)
    {
        CGFloat width = self.frame.size.width;
        NSInteger index = scrollView.contentOffset.x / width;
        
        //當(dāng)滾動到最后一張圖片時,繼續(xù)滾向后動跳到第一張
        if (index == self.imgs.count + 1)
        {
            self.currentIndex = 1;
            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
            [self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            return;
        }
        
        //當(dāng)滾動到第一張圖片時,繼續(xù)向前滾動跳到最后一張
        //當(dāng)且僅當(dāng)滾過第0張圖片的一半的時候,滾動到最后一張
        if (scrollView.contentOffset.x < width * 0.5){
            self.currentIndex = self.imgs.count;
            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
            [self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            return;
        }
    }
}

項目整體代碼地址
https://github.com/tiancanfei/ADCarouselView.git

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

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

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