younger_times
2023-07-18 a2589f9891509d85a873192d56e785885513e780
WanPai/Common/View/CommonBannerView.swift
@@ -8,192 +8,192 @@
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
}