swift轮播图

2016-07-26  本文已影响31人  koktear
import UIKit

let ImageViewCount = 3

class XGHomeHeadView: UIView {
    
    var scrollView: UIScrollView?
    var pageControl: UIPageControl?
    var timer: NSTimer?
    

    var banners: Array<AnyObject>? {
        didSet {
            pageControl?.numberOfPages = (banners?.count)!
            pageControl?.currentPage = 0
            updateContent()
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupScrollView()
        startTimer()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupScrollView() {
        scrollView = UIScrollView(frame: self.bounds)
        scrollView?.showsVerticalScrollIndicator = false
        scrollView?.showsHorizontalScrollIndicator = false
        scrollView?.pagingEnabled = true
        scrollView?.delegate = self
        self.addSubview(scrollView!)
        
        for _ in 0..<ImageViewCount {
            let imgView = UIImageView()
            imgView.userInteractionEnabled = true
            imgView.contentMode = UIViewContentMode.ScaleAspectFill
            imgView.clipsToBounds = true
            let ges = UITapGestureRecognizer(target: self, action: #selector(imgViewDidClicked(_:)))
            imgView.addGestureRecognizer(ges)
            scrollView?.addSubview(imgView)
        }
        
        pageControl = UIPageControl()
        self.addSubview(pageControl!)
        
        scrollView?.contentSize = CGSizeMake(CGFloat(ImageViewCount)*self.bounds.width, 0)
        
        let scrollWiewW = scrollView!.bounds.width
        let scrollWiewH = scrollView!.bounds.height
        for i in 0..<ImageViewCount {
            let imgView = scrollView?.subviews[i]
            imgView?.frame = CGRectMake(CGFloat(i) * scrollWiewW, 0, scrollWiewW, scrollWiewH);
        }
        
        let pageW: CGFloat = 80.0
        let pageH: CGFloat = 20.0
        pageControl?.frame = CGRectMake(0, 0, pageW, pageH)
        pageControl?.center = CGPointMake(scrollWiewW/2, scrollWiewH-pageH/2)
    }
    
    func updateContent() {
        
        for subView in (scrollView?.subviews)!.enumerate() {
            var pageIndex:Int = (pageControl?.currentPage)!
            let imgIndex = subView.index
            let imgView = subView.element as! UIImageView
            
            if imgIndex == 0 {
                pageIndex -= 1
            } else if imgIndex == 2 {
                pageIndex += 1
            }
            
            if pageIndex < 0 {
                pageIndex = (pageControl?.numberOfPages)!-1
            } else if pageIndex >= pageControl?.numberOfPages {
                pageIndex = 0
            }
            
            imgView.tag = pageIndex
            let banner = banners![pageIndex] as! XGBanner
            let image = UIImage(named: banner.image!)
            
            imgView.image = image
        }
        scrollView?.contentOffset = CGPointMake(scrollView!.bounds.width, 0)
    }
    
    func startTimer() {
        if timer == nil {
            timer = NSTimer(timeInterval: 2.0, target: self, selector: #selector(nextImage), userInfo: nil, repeats: true)
            NSRunLoop.currentRunLoop().addTimer(timer!, forMode: NSRunLoopCommonModes)
        }
    }
    
    func nextImage() {
        scrollView?.setContentOffset(CGPointMake(2*(scrollView?.bounds.width)!, 0), animated: true)
    }
    
    func stopTimer() {
        timer?.invalidate()
        timer = nil
    }
    
    func imgViewDidClicked(ges:UITapGestureRecognizer) {
        let view = ges.view
        print(view?.tag)
    }
}

extension XGHomeHeadView: UIScrollViewDelegate {
    func scrollViewDidScroll(scrollView: UIScrollView) {
        var page = 0
        var minDistance: CGFloat = CGFloat(MAXFLOAT)
        
        for imgView in scrollView.subviews {
            var distance: CGFloat = 0
            distance = (imgView.frame.origin.x-scrollView.contentOffset.x)
            distance = CGFloat(abs(Int(distance)))
            if distance < minDistance {
                minDistance = distance
                page = imgView.tag
            }
        }
        pageControl?.currentPage = page
    }
    
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        updateContent()
    }
    
    func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
        updateContent()
    }
    
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        stopTimer()
    }
    
    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        startTimer()
    }
}

上一篇下一篇

猜你喜欢

热点阅读