Swift - 利用UIScrollView 实现轮播图

看过网上很多轮播图的Demo,都是通过UITableView 或者 UICollectionView来实现的,  心血来潮用UIScrollView来实现一下,没做代码优化,只是个Demo。欢迎拍砖偷笑


先赋上代码源码:


//
//  TimerScrollView.swift
//  时光网Swift
//
//  Created by 亓大志 on 16/4/20.
//  Copyright © 2016年 亓大志. All rights reserved.
//

import UIKit

protocol TimerScrollViewDelegate {
    func scrollToIndexOfPage(index:Int)
}

class TimerScrollView: UIView,UIScrollViewDelegate {
    var count : Int = 0
    var timer : NSTimer!
    var timerDelegate:TimerScrollViewDelegate?
    var scrollView : UIScrollView?
    var pageCT : UIPageControl?
    
    /*
    params: 
        array : 图片URL集合
        contentOffSetIndex : 偏移位置
    */
    func configScrollView(array:NSArray,contentOffsetIndex:Int){
        count = array.count
        self.clipsToBounds = false
        self.backgroundColor = UIColor.whiteColor()
        scrollView = UIScrollView(frame: self.bounds)
        scrollView!.delegate = self
        scrollView!.contentSize = CGSizeMake(CGFloat(array.count+2) * self.frame.size.width, self.frame.size.height)
        scrollView!.pagingEnabled = true
        scrollView!.showsHorizontalScrollIndicator = false
        scrollView!.showsVerticalScrollIndicator = false
        self.addSubview(scrollView!)
        createImageViews(array,contentOffsetIndex:contentOffsetIndex)
        
        configPageControll(contentOffsetIndex)
        
        timerBegin()
    }
    
    func createImageViews(array:NSArray,contentOffsetIndex:Int){
        for i in 0 ..< array.count+2{
            var url : String!
            if i == 0 {
                url = array[array.count-1] as! String
            }else if i == array.count + 1 {
                url = array[0] as! String
            }else {
                url = array[i-1] as! String
            }
            
            
            let URL : NSURL = NSURL(string: url)!
            let imageView = UIImageView(frame: CGRectMake(CGFloat(i)*self.frame.size.width, 0, self.frame.size.width, self.frame.size.height))
            //图片的加载需要依赖于框架,
            
            scrollView!.addSubview(imageView)
        }
        
        scrollView!.contentOffset = CGPointMake(CGFloat(contentOffsetIndex+1)*self.frame.size.width, 0)
    }
    
    func configPageControll(currentPage:Int) {
        pageCT = UIPageControl(frame: CGRectMake(0,self.frame.size.height-30.0,self.frame.size.width,15))
        pageCT!.pageIndicatorTintColor = UIColor.grayColor()
        pageCT!.currentPageIndicatorTintColor = UIColor.whiteColor()
        pageCT!.numberOfPages = count
        pageCT!.currentPage = currentPage
        self.addSubview(pageCT!)
    }
    
    //开启
    func timerBegin() {
        if timer != nil {
            timer.invalidate()
            timer = nil
        }
        
        timer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("timerRun:"), userInfo: nil, repeats: true)
        NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
    }
    
    //暂停
    func timerSuspend() {
        if timer != nil {
            timer.invalidate()
            timer = nil
        }
    }
    
    func timerRun(runTimer:NSTimer) {
        let offsetX = scrollView!.contentOffset.x
        UIView.animateWithDuration(0.4, animations: { () -> Void in
                self.scrollView!.contentOffset = CGPointMake(offsetX+self.frame.size.width, 0)
            }) { (boolValue:Bool) -> Void in
                self.resetContentOffset()
        }
        
    }
    
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        timerSuspend()
    }
    
    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        timerBegin()
    }
    
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        resetContentOffset()
    }
    
    func resetContentOffset(){
        if scrollView!.contentOffset.x < self.frame.size.width {
            scrollView!.contentOffset = CGPointMake(self.frame.size.width*CGFloat(count), 0)
        }
        
        if scrollView!.contentOffset.x > self.frame.size.width * CGFloat(count) {
            scrollView!.contentOffset = CGPointMake(self.frame.size.width, 0)
        }
        
        let vc = self.timerDelegate as! UIViewController
        if vc.respondsToSelector(Selector("scrollToIndexOfPage:")) {
            let index = Int((scrollView!.contentOffset.x - self.frame.size.width) / self.frame.size.width)
            pageCT?.currentPage = index
            timerDelegate?.scrollToIndexOfPage(index)
        }
        
        
    }
}


GitHub地址:TimerForScrollView

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值