您的位置:首页 > 移动开发 > Swift

Swift - 利用UIScrollView 实现轮播图

2016-06-20 11:54 344 查看

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

[b]先赋上代码源码:[/b]

//
//  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息