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 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 * 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,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,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,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 }