| | |
| | | import UIKit |
| | | import SDWebImage |
| | | |
| | | //class CommonBannerView: 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? |
| | | // |
| | | class CommonBannerView: 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) |
| | | // |
| | | // //当前显示的只有 center_image 其他两个只是⽤来增加滑动时效果⽽已,不 |
| | | // //addTapGesWithImage(image: center_image) |
| | | // 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.sd_setImage(with: URL(string: 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 |
| | | // |
| | | //} |
| | | |
| | | 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) |
| | | |
| | | //当前显示的只有 center_image 其他两个只是⽤来增加滑动时效果⽽已,不 |
| | | //addTapGesWithImage(image: center_image) |
| | | 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.sd_setImage(with: URL(string: 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 |
| | | |
| | | } |