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. 16-阿里-intership

  2. pyqt官方示例

    文件夹 PATH 列表 卷序列号为 00000058 F027:7BEC C:. ├─activeqt │ └─webbrowser │ ├─icons │ └─pycache ├─animation ...

  3. 动态加载框架DL分析

    动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...

  4. Ioc

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  5. PHPStorm技巧篇 -- 观感优化

    (1)设置默认显示行号 (2)设置自动换行 (3)去除代码下划线(拼写检测) 优化说明:自动换行和显示行号字面意思很好理解,下划线说明一下,phpstorm默认对代码进行拼写校验,即对于不符合英文单词 ...

  6. Oracle Minus关键字

    Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...

  7. mysql:SQL语句操作数据库中表和字段的COMMENT值

    转载:http://blog.163.com/inflexible_simple/blog/static/167694684201182601221758/ 参考文档不太给力啊,表注释和字段注释的资料 ...

  8. python爬虫实战(一)——实时获取代理ip

    在爬虫学习的过程中,维护一个自己的代理池是非常重要的. 详情看代码: 1.运行环境 python3.x,需求库:bs4,requests 2.实时抓取西刺-国内高匿代理中前3页的代理ip(可根据需求自 ...

  9. 【crawler】log4j:WARN No appenders could be found for logger (dao.hsqlmanager).

    This Short introduction to log4j guide is a little bit old but still valid. That guide will give you ...

  10. h5

    1. 在iPhone 手机上默认值是(电话号码显示为拨号的超链接): <meta name="format-detection" content="telephon ...