swift 自定义图片轮播视图
Swift封装图片轮播视图:
import UIKit
class XHAdLoopView: UIView {
    private var pageControl : UIPageControl?
    private var imageScrollView : UIScrollView?
    private var currentPage: NSInteger?
    /*******************  重写get方法 **************/
    private var currentImgs = NSMutableArray()
    private var currentImages :NSMutableArray? {
        get{
            currentImgs.removeAllObjects()
            let count = self.images!.count
            var i = NSInteger(self.currentPage!+count-)%count
            currentImgs.addObject(self.images![i])
            currentImgs.addObject(self.images![self.currentPage!])
            i = NSInteger(self.currentPage!+)%count
            currentImgs.addObject(self.images![i])
            return currentImgs
        }
    }
    /************************************************/
    private var images: NSArray?
    private var autoPlay : Bool?
    private var isFromNet : Bool?
    private var delay : NSTimeInterval?
    var delegate:XHAdLoopViewDelegate?
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    convenience init(frame:CGRect ,images:NSArray, autoPlay:Bool, delay:NSTimeInterval, isFromNet:Bool){
        self.init(frame: frame)
        self.images = images;
        self.autoPlay = autoPlay
        self.isFromNet = isFromNet
        self.delay = delay
        self.currentPage = 
        createImageScrollView()
        createPageView()
        if self.autoPlay == true {
            startAutoPlay()
        }
    }
    //创建图片滚动视图
    private func createImageScrollView(){
        if images?.count ==  {
            return
        }
        imageScrollView = UIScrollView(frame: self.bounds)
        imageScrollView?.showsHorizontalScrollIndicator = false
        imageScrollView?.showsVerticalScrollIndicator=false
        imageScrollView?.bounces = false
        imageScrollView?.delegate = self
        imageScrollView?.contentSize = CGSizeMake(self.bounds.width*, )
        imageScrollView?.contentOffset = CGPointMake(self.frame.width, )
        imageScrollView?.pagingEnabled = true
        self.addSubview(imageScrollView!)
        for index in ..< {
            let imageView = UIImageView(frame: CGRectMake(self.bounds.width*CGFloat(index), , self.bounds.width, self.bounds.height))
            imageView.userInteractionEnabled = true
            imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "imageViewClick"))
            if self.isFromNet == true {
            }
            else{
                imageView.image = UIImage(named: self.currentImages![index] as! String);
            }
            imageScrollView?.addSubview(imageView)
        }
    }
    //创建pageControl视图
    private func createPageView(){
        if images?.count ==  {
            return
        }
        let pageW: CGFloat =
        let pageH: CGFloat =
        let pageX: CGFloat = self.bounds.width - pageW
        let pageY: CGFloat = self.bounds.height - pageH
        pageControl = UIPageControl(frame: CGRectMake(pageX, pageY, pageW, pageH))
        pageControl?.numberOfPages = images!.count
        pageControl?.currentPage =
        pageControl?.userInteractionEnabled = false
        self.addSubview(pageControl!)
    }
    private func startAutoPlay() {
        self.performSelector("nextPage", withObject: nil, afterDelay: delay!)
    }
    func nextPage() {
        NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: "nextPage", object: nil)
        imageScrollView!.setContentOffset(CGPointMake( * self.frame.width, ), animated: true)
        self.performSelector("nextPage", withObject: nil, afterDelay: delay!)
    }
    //每次图片滚动时刷新图片
    private func refreshImages(){
        for i in ..<imageScrollView!.subviews.count {
            let imageView = imageScrollView!.subviews[i] as! UIImageView
            if self.isFromNet == true {
            }
            else{
                imageView.image = UIImage(named: self.currentImages![i] as! String);
            }
        }
        imageScrollView!.contentOffset = CGPointMake(self.frame.width, )
    }
    //图片点击
    func imageViewClick(){
        if self.delegate != nil && (self.delegate?.respondsToSelector("adLoopView:IconClick:")) != nil {
            self.delegate!.adLoopView(self, IconClick: currentPage!)
        }
    }
}
extension XHAdLoopView : UIScrollViewDelegate{
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        scrollView.setContentOffset(CGPointMake(self.frame.width, ), animated: true)
    }
    func scrollViewDidScroll(scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x
        let width = self.frame.width
        if x >= *width {
            currentPage = (currentPage!+) % self.images!.count
            pageControl!.currentPage = currentPage!
            refreshImages()
        }
        if x <=  {
            currentPage = (currentPage!+self.images!.count-) % self.images!.count
            pageControl!.currentPage = currentPage!
            refreshImages()
        }
    }
}
//自定义代理方法
protocol XHAdLoopViewDelegate:NSObjectProtocol {
    func adLoopView(adLoopView:XHAdLoopView ,IconClick index:NSInteger)
}
调用封装的类:
import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let frame = CGRectMake(, , view.bounds.width, view.bounds.width*0.6)
        let imageView = ["2.jpg","3.jpg","4.jpg"]
        let loopView = XHAdLoopView(frame: frame, images: imageView, autoPlay: true, delay: 2.5, isFromNet: false)
        loopView.delegate = self
        view.addSubview(loopView)
    }
}
//遵循协议代理,调用代理方法
extension ViewController : XHAdLoopViewDelegate {
    func adLoopView(adLoopView: XHAdLoopView, IconClick index: NSInteger) {
        print(index)
    }
}
效果图:

刚接触Swift,菜鸟一枚,望大神指点!由于懒得导入SDWebImage,所以图片来自网络时的加载省略了:
if self.isFromNet == true {
// 加载网络图片
}
Demo下载地址:https://github.com/huahua0809/XHAdScrollView
swift 自定义图片轮播视图的更多相关文章
- iOS开发项目实战——Swift实现图片轮播与浏览
		近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ... 
- EUI   Scroller实现自定义图片轮播    组件ScrollView
		一 自定义组件如下 /** * 文 件 ScrollView.ts * 功 能: 滚动组件 * 内 容: 自定义组件,支持多张图片水平(垂直)切换滚动 * * Example: * 1. 从自定义组件 ... 
- swift:创建滚动视图的图片轮播器
		用swift创建图片轮播器和用OC创建的方式是一样的,都主要用到UIScrollView和UIImageview这两个控件,有几张图片,就将滚动视图的内容区域大小设置为每一张图片的大小乘以张数即可.然 ... 
- PgwSlideshow-基于Jquery的图片轮播插件
		0 PgwSlideshow简介 PgwSlideshow是一款基于Jquery的图片轮播插件,基本布局分为上下结构,上方为大图轮播区域,用户可自定义图片轮播切换的间隔时间,也可以通过单击左右方向按键 ... 
- Swift 使用CollectionView 实现图片轮播封装就是这样简单
		前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器; 自制图片 先上Demo:Github上封装好的下载即用, 好用请Star Thanks首先新建一个继承于UIV ... 
- 【iOS之轮播视图、自定义UIPageControl】
		基于UISrollView实现的无限循环轮播视图. 实现的思路:使用三个UIImageView不断循环利用,始终将最中间一个View显示在UIScrolView的contentSize上,每次滚动后, ... 
- 高效图片轮播,两个imageView实现
		本文是投稿文章,作者:codingZero 导语 在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里 ... 
- Android零基础入门第49节:AdapterViewFlipper图片轮播
		原文:Android零基础入门第49节:AdapterViewFlipper图片轮播 上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilp ... 
- 原生JS实现"旋转木马"效果的图片轮播插件
		一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ... 
随机推荐
- java面向对象的语言
			对象:真实存在唯一的事物. 类: 实际就是对某种类型事物的共性属性与行为的抽取. 抽象的概念.... 车 我们从小的时候就不断的接触很多的对象,我们的大脑就会把 这些具备相同属性与行为的事物进行分类. ... 
- C语言的总结
			在C语言考试的中,我成绩不是很好,其实在学习C语言的时候我没有好好去学过,我知道了是我自己的错误,我不应该抱着侥幸的心里去上课的,我会去好好听课的哦l 
- IntelliJ IDEA中Maven项目的默认JDK版本
			在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:"Warning:Java: 源值1.5已过时, 将在未来所有 ... 
- Android编译环境折腾记
			题记:感觉是时候写点什么了=_=! 第一次安装了ubuntu14.04.5,官网下载的iso,官网下的jar,编译android4.x需要安装jdk6,更高的版本会有问题,baidu到很多搭建环境的步 ... 
- yii2-basic后台管理功能开发之三:自定义GridView列显示
			在第二篇 yii2-basic后台管理功能开发之二:创建CRUD增删改查 中,我们利用gii工具生成的结果一般并不是我们想要的结果. 我们需要根据自己的需求自定义列显示.我遇到的主要是一下变更: 时间 ... 
- Load Runner录制C/S客户端
			1. 打开应用程序 2. 点击如下菜单 弹出窗口如下 3. 点击New,弹出窗口如下,选择Web(HTTP/HTML) 4. 点击Create,弹出窗口 5. 点击OK, ... 
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
			上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ... 
- WinForm 公共控件
			一.窗体属性: 1.AcceptButton - 窗体的“接受”按钮.如果设置该属性,每次用户按“Enter”键都相当于“单击”了该按钮. 需要设置哪个键,就在后面选择. 2.CancelButton ... 
- SQL 存储过程 解析XML
			第一种说明: 我看过这样一篇文章,如下 在SQL Server2005中,微软延续了 2000中一个特性(即支持XML类型的数据),并加强了对XML 数据列.XML变量以及XML索引的支持 ... 
- guava学习--ratelimiter
			RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数. RateLimiter limiter = RateLimiter.create(4.0); //每秒不 ... 
