前言
我们在开发中经常会有开发广告轮播图的需求,在这里讲解一种实现方式,只需要使用3个UIImageView实现无限循环的功能。
Demo我放到GitHub上了,有需要的朋友可以参考,喜欢的话请给个星:https://github.com/coderZjc/BYCycleScrollView
效果展示:
原理说明
在这个方案中,我们会使用三个UIImageView用于承载Image,但每次滚动完成后都调整每个UIImageView的Image,然后调用以下方法去设置ScrollView的位置,使其回到最中间第二张UIImageView(通过设置animated:false)的方式在视觉上达到无限循环的效果。
func setContentOffset(_ contentOffset: CGPoint, animated: Bool)
大致原理就是这样,具体实现请看下面的内容。
1、首先我们要创建一个自定义的类继承自UIScrollView,首先分析一下,我们需要对外开放的接口有:供设置的图片数组(或者图片URL数组)、轮播的时间间隔、代理。
//MARK: 供外部赋值
weak var customDelegate: BYScrollViewDelegate?//代理
public var imageURLArray: [String]? //图片URL数组
public var imagesArray: [UIImage] //图片数组
public var timeInterval: TimeInterval = 5 //轮播时间间隔,默认是5秒
2、内部我们需要创建三个UIImageView连续放置,如下图所示
//MARK: 内部私有
private var currentIndex: Int = 0 //当前下标值,默认是0
private var imageView1: UIImageView?
private var imageView2: UIImageView?
private var imageView3: UIImageView?
private var timer: Timer? //计时器,用于图片轮播计时
3、在我们对该类的对象赋值图片数组后,我们要设置每个UIImageView的image,然后实现ScrollView的代理,当用户滑动完成的时候需要记录下当前的下标值并且重新设置图片将图片的顺序做个调换,并将ScrollView滚动回最中间的位置(不使用动画),这样就达到了无限循环的效果。
4、提示:因为在自定义的ScrollView里我们需要设置计时器,为了对象能顺利释放,所以要复写removeFromSuperview,在里面销毁计时器
//MARK: 复写removeFromSuperview方法,在这里销毁计时器,不然无法释放对象
override func removeFromSuperview()
{
super.removeFromSuperview()
//销毁计时器
guard let myTimer=self.timer else
{
return
}
myTimer.invalidate()
}
具体的代码实现请参照 Demo