swift 图片循环滚动

import UIKit

/**

 *  图片循环滚动

 */

class ZJImageScroll: UIScrollView ,UIScrollViewDelegate{

    private var scroll_imageViewCount = 3

    private var scroll_imgviews = Array<UIImageView>()

    private var scroll_nowIndexpage = 0

    private var scroll_timer : Timer!

    // 外界传入

    private var scroll_scrolltime = 3

    private var scroll_isAutoScroll = true

    private var newScroll_imageStrs = [String]()

    var scroll_imageStrs : [String] {

        get{

            return self.newScroll_imageStrs

        }

        set{

           self.newScroll_imageStrs = newValue

            self.updateScrollContent()

            if self.scroll_isAutoScroll == true {

                self.startScrollTimer()

            }

        }

    }

    


    init(frame: CGRect,_ imageStrs:Array<String>,_ time:TimeInterval?,_ isAutoScroll:Bool?) {

        super.init(frame: frame)

        // 设置属性

        self.backgroundColor = UIColor.clear;

        self.showsHorizontalScrollIndicator = false;

        self.showsVerticalScrollIndicator = false;

        self.isPagingEnabled = true;

        self.bounces = false;

        self.delegate = self;

        // 记录外界传入数值

        //self.scroll_imageStrs = imageStrs

        if time != nil {

            self.scroll_scrolltime = Int(time!)

        }

        if isAutoScroll != nil {

            self.scroll_isAutoScroll = isAutoScroll!

        }

        //

        self.setSubviews()

        //

        if self.scroll_imageStrs.count>1 {

            self.updateScrollContent()

        }

        if self.scroll_imageStrs.count>1 && self.scroll_isAutoScroll == true {

            self.startScrollTimer()

        }

    }


    /** 添加视图*/

    private func setSubviews() {

        let scroll_width = self.frame.size.width

        let scroll_height = self.frame.size.height

        for index in 0..<self.scroll_imageViewCount {

            let scroll_imgview = UIImageView(frame: CGRect(x: scroll_width*CGFloat(index), y: 0, width: scroll_width, height: scroll_height))

            self.addSubview(scroll_imgview)

            self.scroll_imgviews.append(scroll_imgview)

        }

        self.contentSize = CGSize(width: CGFloat(self.scroll_imageViewCount)*scroll_width, height: 0)

    }

    /** 处理代理方法*/

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        // 找出最中间的那个图片控件

        var pageIndex:Int = 0

        var minDistance = MAXFLOAT

        for index in 0..<self.scroll_imgviews.count {

            let scroll_imgview = self.scroll_imgviews[index]

            var distance:Float = 0

            distance = Float(abs(scroll_imgview.frame.origin.x - self.contentOffset.x))

            if distance - minDistance < 0 {

                minDistance = distance

                pageIndex = Int(scroll_imgview.tag)

            }

        }

        self.scroll_nowIndexpage = Int(pageIndex);

    }

    

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        

        if self.scroll_isAutoScroll == true && self.scroll_imageStrs.count>1 {

            

            self.startScrollTimer()

        }

    }

    

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

        if self.scroll_isAutoScroll == true && self.scroll_imageStrs.count>1 {

            

            self.startScrollTimer()

        }

    }

    

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

       self.updateScrollContent()

    }

    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

        self.updateScrollContent()

    }

    

    /** 更新内容*/

    private func updateScrollContent() {

    

        if self.scroll_imageStrs.count<1{

            return

        }

            

        for index in 0..<self.scroll_imageViewCount {

            var pageIndex = self.scroll_nowIndexpage

            if index == 0 {

                pageIndex -= 1

            }else if index == 2 {

                pageIndex += 1

            }

            if pageIndex < 0 {

                pageIndex = self.scroll_imageStrs.count - 1

            }else if pageIndex >= self.scroll_imageStrs.count{

                pageIndex = 0

            }

            let scroll_imgview = self.scroll_imgviews[index]

            scroll_imgview.tag = pageIndex

            //

            let scroll_image = UIImage(named: self.scroll_imageStrs[pageIndex])

            scroll_imgview.image = scroll_image

        }

        self.setContentOffset(CGPoint(x:self.frame.size.width , y: 0), animated: false)

    }

    /** 开启定时器*/

    private func startScrollTimer() {

        if self.scroll_timer == nil {

            

            self.scroll_timer = Timer.scheduledTimer(timeInterval: TimeInterval(self.scroll_scrolltime), target: self, selector: #selector(timerRuning), userInfo: nil, repeats: true)

        }

    }

    /** 定时器跑起来*/

    @objc func timerRuning() {

        self.setContentOffset(CGPoint(x:self.frame.size.width*2 , y: 0), animated: true)

    }

    

    /** 关闭定时器 (方便外界调用)*/

    func stopScrollTimer() {

        guard let timer1 = self.scroll_timer

            else{ return }

        timer1.invalidate()

        self.scroll_timer.invalidate();

        self.scroll_timer = nil;

    }


    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

}


猜你喜欢

转载自blog.csdn.net/qq_37191821/article/details/80835663