iOS轮播图,用CollectionView自定义轮播图,pagingEnable原理

本文介绍了如何使用UICollectionView自定义无限轮播图,并模拟pagingEnable效果。通过设置虚拟数据实现无限滚动,调整scrollView拖动后的目标位置,以及修改减速率以达到平滑翻页的感觉。详细代码和实现思路可供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

轮播图.gif

写在前面

我的需求是轮播图两侧需要有间距,有点类似于QQ音乐发现页的轮播图。一开始就想到collectionView来实现高效的轮播图。但是对于ScrollView的pagingEnable这样的属性,在banner两侧到屏幕有间距的时候,就会有问题。所以就顺带模拟实现了ScrollView的PagingEnable为YES时的效果。

关键代码
一、最最重要的当然是怎么让有限的数据来实现无限轮播呢?

比方我们接口返回轮播图的数据只有4个,但是我们要实现无限滚动,怎么办呢?

我们可以设置一个虚拟数据virtualCount,设置到很大,比如:virtualCount = 1000000。然后用这个虚拟数据来充当collectionView数据源的个数。然后在用到model数据的时候再取余从数据源中取model。就是这个意思self.dataArray[virtualCount%self.dataArray.count];

具体见如下代码:

- (void)setupBannerData:(NSArray *)models {
    if (!models || models.count == 0) return;

    //配置数据
    self.dataArray = [NSMutableArray arrayWithArray:models];
    if (models.count == 1){
        //数据源个数等于1的时候,不需要轮播,虚拟数据设置为10000
        self.virtualCellCount = 1;
        
本Demo使用UICollectionView实现自动无限轮播功能。 主要功能: 1.实现自动轮播,可修改轮播的时间 2.轮播图片可以来自本地,也可来自网络,通过单独的方法进行设置即可。对于加载网络图片时,Demo中使用了YYWebImage,也可自行替换成SDWebImage。 3.重写了和系统UIPageControl一样的功能,可用图片代替PageControl上的点点,也可自定义其颜色以及切换动画。 使用方法:使用方法比较简单。 /** * 加载本地图片Banner */ - (void)setupLocalBannerImageView { NSArray *array = @[@"1.png", @"2.png", @"3.png", @"4.png", @"5.png"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200) locationImageArray:array]; bannerVew.timeInterval = 2.0; [self.view addSubview:bannerVew]; } /** * 加载网络图片Banner */ - (void)setupNetWorkBannerImageView { NSArray *array = @[@"http://i3.download.fd.pchome.net/t_960x600/g1/M00/07/09/oYYBAFMv8q2IQHunACi90oB0OHIAABbUQAAXO4AKL3q706.jpg", @"http://images.weiphone.net/attachments/photo/Day_120308/118871_91f6133116504086ed1b82e0eb951.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/110425215921926a173e0f728e.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/1104241737046031b3a754f783.jpg"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 200) netWorkImageArray:array placeHolderImage:nil]; bannerVew.timeInterval = 2.0; bannerVew.pageControlStyle = FFPageControlStyleMiddle; bannerVew.delegate = self; [self.view addSubview:bannerVew]; } 以上方式即可简单使用,如需自定义PageControl也可继承FFAbstractDotView,做些基本的设置即可。 gitHub下载地址:喜欢的朋友请给个星呗! 欢迎各位一起来讨论,有问题请发邮箱270452746@qq.com或者直接加我QQ:270452746进行讨论。谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值