swift bannerview 广告轮播图

class BannerView: UIView,UIScrollViewDelegate{
 
 //图⽚⽔平放置到scrollView上
 private var scrollView:UIScrollView = UIScrollView()
 //⼩圆点标识
 private var pageControl:UIPageControl = UIPageControl()
 private var imageViews:Array = Array<UIImageView>()
 
 
 //图⽚集合
 private var images:Array<String> = []
 private var type:ImageType?
 
 private var width:CGFloat = 0
 private var height:CGFloat = 0
 
 private var currIndex = 0
 private var clickBlock :(Int)->Void = {index in}
 
 private var timer:Timer?
 
 // 默认⾃动播放 设置为false只能⼿动滑动
 var isAuto = true
 // 轮播间隔时间 默认6秒可以⾃⼰修改
 var interval:Double = 6
 
 private var startOffsetX:CGFloat = 0
 
 override func layoutSubviews() {
 super.layoutSubviews()
 }
 
 public func setImages(images:Array<String>,type:ImageType 
= .Image,imageClickBlock:@escaping (Int) -> Void) {
 self.type = type
 self.images = images
 self.clickBlock = imageClickBlock
 self.initLayout()
 }
 
 private func initLayout(){
 if(self.images.count == 0){
 return
 }
 
 width = self.bounds.width
 height = self.bounds.height
 
 scrollView.frame = self.bounds
 scrollView.contentSize = CGSize(width:width * CGFloat(images.count + 
2),height:height)
 scrollView.contentOffset = CGPoint(x:width,y:0)
 scrollView.isUserInteractionEnabled = true
 scrollView.isPagingEnabled = true
 scrollView.showsHorizontalScrollIndicator = false
 scrollView.delegate = self
 self.addSubview(scrollView)
 
 var image = UIImageView()
 image.frame = CGRect(x:0,y:0,width:width,height:height)
 image.contentMode = .scaleToFill
 image.isUserInteractionEnabled = true
 setImage(image: image, index: images.count - 1)
 scrollView.addSubview(image)
 for i in 1 ... images.count{
 let image = UIImageView()
 image.frame = CGRect(x:width * 
CGFloat(i),y:0,width:width,height:height)
 image.contentMode = .scaleToFill
 image.isUserInteractionEnabled = true
 scrollView.addSubview(image)
 setImage(image: image, index: i - 1)
 addTapGesWithImage(image: image)
 }
 image = UIImageView()
 image.frame = CGRect(x:width * CGFloat(images.count + 
1),y:0,width:width,height:height)
 image.contentMode = .scaleToFill
 image.isUserInteractionEnabled = true
 scrollView.addSubview(image)
 setImage(image: image, index: 0)
 
 pageControl.center = CGPoint(x:width/2,y:height - CGFloat(15))
 pageControl.isEnabled = true
 pageControl.numberOfPages = images.count
 pageControl.currentPageIndicatorTintColor = UIColor.green
 pageControl.pageIndicatorTintColor = UIColor.gray
 pageControl.isUserInteractionEnabled = false
 self.addSubview(pageControl)
 if(isAuto){
 openTimer()
 }
 setCurrent(currIndex: 0)
 }
 
 private func setImage(image:UIImageView,index:Int){
 if(type == .Image){
 image.image = UIImage.init(named:images[index])
 }else{
 image.setMyImage(url: images[index])
 }
 }
 
 func setCurrent(currIndex:Int) {
 if(currIndex < 0){
 self.currIndex = images.count - 1
 }else{
 self.currIndex = currIndex
 }
 pageControl.currentPage = self.currIndex
 scrollView.setContentOffset(CGPoint(x:width * CGFloat(self.currIndex + 
1),y:0), animated: false)
 }
 
 //给图⽚添加点击⼿势
 private func addTapGesWithImage(image:UIImageView) {
 let tap = UITapGestureRecognizer(target: self, action: #selector(tap(_:)))
 image.isUserInteractionEnabled = true //让控件可以触发交互事件
 image.contentMode = .scaleToFill
// image.clipsToBounds = true //超出⽗控件的部分不显示
 image.addGestureRecognizer(tap)
 }
 
 //点击图⽚,调⽤block
 @objc func tap(_ ges:UITapGestureRecognizer) {
 clickBlock((ges.view?.tag)!)
 }
 
 func scrollViewDidScroll(_ scrollView: UIScrollView) {
 
 }
 
 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
 startOffsetX = scrollView.contentOffset.x
 closeTimer()
 }
 
 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate 
decelerate: Bool) {
 }
 
 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
 if(scrollView.contentOffset.x > startOffsetX){
 currIndex = (currIndex + 1) % images.count
 }else{
 currIndex = (currIndex - 1) % images.count
 }
 setCurrent(currIndex: currIndex)
 openTimer()
 }
 
 func openTimer(){
 if(isAuto){
 closeTimer()
 timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: 
#selector(startAutoScroll), userInfo: nil, repeats: true)
 }
 }
 
 func closeTimer(){
 if(timer != nil){
 timer?.invalidate()
 timer = nil
 }
 }
 
 
 @objc func startAutoScroll(){
 if(isDisplayInScreen()){
 setCurrent(currIndex: (currIndex + 1) % images.count)
 }
 }
 
 func isDisplayInScreen() -> Bool{
 if(self.window == nil){
 return false
 }
 return true
 }
 
}
enum ImageType{
 case Image //本地图⽚
 case URL //URL
}