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实现的, ...
随机推荐
- 安装配置dradis
github:https://github.com/dradis/dradis-ce/blob/master/README.md安装出现错误:== Copying sample files == == ...
- caffe安装:ubuntu16.04 + opencv2.4 + python 2.7+ CUDA 8.0 RC + CuDNN 5.0
官方教程:http://caffe.berkeleyvision.org/install_apt.html 主要参考教程: https://github.com/BVLC/caffe/wiki/Ubu ...
- ueditor .net版本上传图片功能配置
1.官网下载 UEditor .Net最新版:官方网址:http://ueditor.baidu.com/website/download.html#ueditor UTF-8版 和GBK版选择疑 ...
- codeforces 744C Hongcow Buys a Deck of Cards
C. Hongcow Buys a Deck of Cards time limit per test 2 seconds memory limit per test 256 megabytes in ...
- React组件库
图表组件库:Recharts(React和D3构建的图表库) UI组件库:react-bootstrap
- linux sort,uniq,cut,wc.
文章转自 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858385.html sort sort 命令对 File 参数指定的文件中的行排 ...
- 把数据输出到Word (非插件形式)
项目开发过程中,我们要把数据以各种各样的形式展现给客户.把数据以文档的形式展现给客户相信是一种比较头疼的问题,如果没有好的方法会 使得我的开发繁琐,而且满足不了客户的需求.接下来我会通过两种开发方式介 ...
- Scrum Meeting 12-20151218
任务安排 姓名 今日任务 明日任务 困难 董元财 无 网络连接框架优化 无 胡亚坤 无 修复商品列表排列混乱) 无 刘猛 无 无 马汉虎 无 无 赖彦俞 无 无 燃尽图 团队照片 代码签入记录 今天开 ...
- Datatable+Springmvc+mybatis(分页+排序+搜索)_Jquery
一.简介 通过Jqury的Datatable插件,构造数据列表,并且增加或者隐藏相应的列,已达到数据显示要求.同时, jQuery Datatable 强大的功能支持:排序,分页,搜索等. 二.前台分 ...
- build.fxbuild打不开 Failed to create the part's controls
Failed to create the part's controls 以文本形式打开之后,发现编码的地方不是常用编码 将之修改为GBK 然后就可以正常打开了 最后把eclipse中的编码统一设置为 ...