一行iOS代码实现图片无限轮播器

  

最近一直在找实现图片无限轮播的方法,在网上也看了不少方法,大都不太合适,最终看到某它培训公司一位讲师用

  

<强> UICollectionView: 一行代码实现图片无限轮播器的方法,当然想一行代码实现轮播功能,前期还是有一些工作要做。下面就把这个方法分享给大家!

  

<强>一、图片无限轮播实现效果图:

  

一行iOS代码实现图片无限轮播器

  

图片无限轮播gif

  

<强>二,实现原理与分析:

  

假设有三张图片0,1,2,想要实现无限轮播,我们可以将UICollectionView的细胞个数设为图片的个x 3数,也就是把三张图片重复添加到9个细胞中,可以把无限轮播分解成五种特殊的状态(五个临界点),轮播开始时为初始状态,在定时器的作用下依次滚动到最后一个细胞,此时为右临界状态显示的是第2张图片,若想继续无缝滚动到第0图片,我们可以偷偷的将collectionView滚动到第三个细胞上,可以看第四幅转态图此时显示的依然是第2张图片,这样再次滚动就是第0张图,这样就实现了细胞向左滚动的无限循环轮播,向右滚动的原理一样,就是第三幅图到第五幅图的变化。

  

一行iOS代码实现图片无限轮播器

  

初始界状态png

  

一行iOS代码实现图片无限轮播器

  

右临界状态png

  

一行iOS代码实现图片无限轮播器

  

左临界状态png

  

一行iOS代码实现图片无限轮播器

  

Paste_Image.png   

一行iOS代码实现图片无限轮播器

  

Paste_Image.png   

<强>三、代码:

  

一行iOS代码实现图片无限轮播器

  

类文件png

  
      <李>,JFWeakTimerTargetObject继承自NSObject李   <李> JFLoopView继承自UIView李   <李> JFLoopViewCell继承自UICollectionViewCell李   <李> JFLoopViewLayout继承自UICollectionViewFlowLayout李   <李> JFMainViewController继承自ui李   
  

JFWeakTimerTargetObject重写定时器NSTimer的+ (NSTimer *) scheduledTimerWithTimeInterval: ti (NSTimeInterval)目标:(id) aTarget选择器:(SEL) aSelector用户信息:用户信息重复(nullable id): (BOOL) yesOrNo;类方法的目的是:避免当定时器强引用JFLoopView类,JFLoopView无法被释放的问题。
  

  

        # import & lt;基?Foundation.h>   @ interface JFWeakTimerTargetObject: NSObject   + (NSTimer *) scheduledTimerWithTimeInterval:(NSTimeInterval) ti目标:(id) aTarget选择器:(SEL) aSelector用户信息:用户信息重复(nullable id): (BOOL) yesOrNo;      @end   之前      

        #进口“JFWeakTimerTargetObject.h”      @ interface JFWeakTimerTargetObject ()      @ property(原子、弱)id的目标;   @ property(原子,分配)选取选择器;      @end      @ implementation JFWeakTimerTargetObject      + (NSTimer *) scheduledTimerWithTimeInterval:(NSTimeInterval) ti目标:(id) aTarget选择器:(SEL) aSelector用户信息:用户信息重复(nullable id): (BOOL) yesOrNo {//创建当前类对象   JFWeakTimerTargetObject *对象=[[JFWeakTimerTargetObject alloc] init);   对象。目标=aTarget;   对象。选择器=aSelector;   返回(NSTimer scheduledTimerWithTimeInterval: ti目标:对象选择器:@ selector(火:)用户信息:用户信息重复:yesOrNo);   }      - (void)消防:(id) obj {   (自我。目标performSelector:自我。选择器withObject obj):;   }      @end   之前      

        # import & lt; UIKit/UIKit.h>      @ interface JFLoopView: UIView//JFLoopView初始化方法   - (instancetype) initWithImageArray:(NSArray *) imageArray;      @end   之前      

        #进口“JFLoopView.h”      #进口“JFLoopViewLayout.h”   #进口“JFLoopViewCell.h”   #进口“JFWeakTimerTargetObject.h”      @ interface JFLoopView () & lt; UICollectionViewDelegate UICollectionViewDataSource>      @ property(原子、强)UICollectionView * collectionView;   @ property(原子、强)UIPageControl * pageControl;   @ property(原子、强)NSArray * imageArray;   @ property(原子、弱)NSTimer *定时器;      @end      静态NSString * ID=@“loopViewCell”;      @ implementation JFLoopView      - (instancetype) initWithImageArray:(NSArray *) imageArray {   如果(自我=(超级init)) {   UICollectionView * collectionView=[[UICollectionView alloc] initWithFrame: CGRectZero collectionViewLayout: [[JFLoopViewLayout alloc] init]];   [collectionView registerClass (JFLoopViewCell类):forCellWithReuseIdentifier: ID];   collectionView。数据源=自我;   collectionView.delegate=自我;   (自我addSubview: collectionView);      自我。collectionView=collectionView;   自我。imageArray=imageArray;//添加分页器   (自我addSubview: self.pageControl);//回到主线程刷新UI   设置(dispatch_get_main_queue ()、^ {//设置滚动的初始状态在   (自我。collectionView scrollToItemAtIndexPath:(NSIndexPath indexPathForItem: self.imageArray。计算切口:0]atScrollPosition: UICollectionViewScrollPositionLeft动画:没有);//添加定时器   (自我addTimer);   });      }   回归自我;   }///懒加载pageControl   ——(UIPageControl *) pageControl {   如果(! _pageControl) {   _pageControl=[[UIPageControl alloc] initWithFrame: CGRectMake (0 220 0, 30)];   _pageControl。numberOfPages=self.imageArray.count;   _pageControl。pageIndicatorTintColor=[用户界面颜色orangeColor];   _pageControl。currentPageIndicatorTintColor=[用户界面颜色purpleColor];   }   返回_pageControl;   }      # pragma马克- - - UICollectionViewDataSource数据源方法   ——(NSInteger) collectionView:(UICollectionView *) collectionView numberOfItemsInSection: {(NSInteger)部分   self.imageArray返回。数* 3;   }      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

一行iOS代码实现图片无限轮播器