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 自定义图片轮播视图的更多相关文章

  1. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  2. EUI Scroller实现自定义图片轮播 组件ScrollView

    一 自定义组件如下 /** * 文 件 ScrollView.ts * 功 能: 滚动组件 * 内 容: 自定义组件,支持多张图片水平(垂直)切换滚动 * * Example: * 1. 从自定义组件 ...

  3. swift:创建滚动视图的图片轮播器

    用swift创建图片轮播器和用OC创建的方式是一样的,都主要用到UIScrollView和UIImageview这两个控件,有几张图片,就将滚动视图的内容区域大小设置为每一张图片的大小乘以张数即可.然 ...

  4. PgwSlideshow-基于Jquery的图片轮播插件

    0 PgwSlideshow简介 PgwSlideshow是一款基于Jquery的图片轮播插件,基本布局分为上下结构,上方为大图轮播区域,用户可自定义图片轮播切换的间隔时间,也可以通过单击左右方向按键 ...

  5. Swift 使用CollectionView 实现图片轮播封装就是这样简单

    前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器; 自制图片 先上Demo:Github上封装好的下载即用, 好用请Star Thanks首先新建一个继承于UIV ...

  6. 【iOS之轮播视图、自定义UIPageControl】

    基于UISrollView实现的无限循环轮播视图. 实现的思路:使用三个UIImageView不断循环利用,始终将最中间一个View显示在UIScrolView的contentSize上,每次滚动后, ...

  7. 高效图片轮播,两个imageView实现

    本文是投稿文章,作者:codingZero 导语 在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里 ...

  8. Android零基础入门第49节:AdapterViewFlipper图片轮播

    原文:Android零基础入门第49节:AdapterViewFlipper图片轮播 上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilp ...

  9. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

随机推荐

  1. Docker镜像文件存储结构

    docker相关文件存放在:/var/lib/docker目录下 镜像的存储结构主要分两部分,一是镜像ID之间的关联,一是镜像ID与镜像名称之间的关联,前者的结构体叫Graph,后者叫TagStore ...

  2. 承接unity外包:2016年VR产业八大发展趋势

    在上周进行的2016年全球游戏开发者大会(GDC)期间,虚拟现实技术是一个重要议题.英文科技媒体VentureBeat近日刊出了一篇文章,对2016年VR产业的发展趋势进行了预测.游戏陀螺对文章分享的 ...

  3. Linux时间设置及同步

    Linux系统安装时选择的UTC时间是国际标准时间,而中国处于UTC+8时区,因此安装系统时不要选择UTC时区. 还有就是Linux有两个时钟: 1.Bios时钟及硬件时间 2.Kernel时钟及系统 ...

  4. hibernate一级缓存的源码初窥

    hibernate的一级缓存的存在使得hibernate可以在操作实体化对象的时候减少对于数据库的访问.hibernate的一级缓存实际上就是指的session缓存,它的生命周期和session相同. ...

  5. Windows 7 封装篇(一)【母盘定制】[手动制作]定制合适的系统母盘

    Windows 7 封装篇(一)[母盘定制][手动制作]定制合适的系统母盘 http://www.win10u.com/article/html/10.html Windows 7 封装篇(一)[母盘 ...

  6. iOS CommonCrypto 对称加密 AES ecb,cbc

    CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...

  7. 关于unity碰撞检测器的用法

    今天已经是我第三次忘记了这两种碰撞检测的用法,混淆了.特意整理一下 首先把今天要解决涉及到的东西列出来 碰撞方法: public void OnTriggerEnter(Collider other) ...

  8. linux rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpm

    linux rpm 安装mysql异常: [root@localhost upload]# rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpmerror: Fail ...

  9. svg转化成canvas以便生成base64位的图片

    很久前写了关于把html转成图片的一个例子,最近有出了新的问题.利用html2canvas.js文件把html转成base64位的图片是没什么问题的,但也不是绝对的,比如这时候不能碰见svg这个鬼,h ...

  10. 封装properties从配置文件读取测试用例输入数据

    当每个测试用例都有输入数据,而且数据量比较大的情况,可以采取从文件读取 如果想让同一套测试用例能够适应相似的输入数据,如果直接代码里面来回切换回可能会漏,而且还需要debug检错 可以把一些公用的输入 ...