Swift 使用CollectionView 实现图片轮播封装就是这样简单
前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器;
先上Demo:Github上封装好的下载即用, 好用请Star Thanks
首先新建一个继承于UIView的视图, 且用collectionView实现所以需要签订两个协议代码如下:
let sectionNum: Int = 100 // 区的数量
let width = UIScreen.mainScreen().bounds.size.width // 屏幕宽度
let height = UIScreen.mainScreen().bounds.size.width // 屏幕高度
// 因为要实现轮播图片可以点击定义一个协议
// 协议
protocol XTCycleViewDelegate {
func didSelectIndexCollectionViewCell(index: Int)->Void
}
class XTCycleScrollView: UIView, UICollectionViewDelegate, UICollectionViewDataSource{
使用到的变量以及创建视图
var delegate: XTCycleViewDelegate?
var cycleCollectionView: UICollectionView?
var images = NSMutableArray()
var pageControl = UIPageControl()
var flowlayout = UICollectionViewFlowLayout()
var timer = NSTimer()
override init(frame: CGRect) {
super.init(frame: frame)
self.createSubviews(frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
布局必要的UI以及创建定时器
func createSubviews(frame: CGRect){
cycleCollectionView = UICollectionView.init(frame: CGRectMake(0, 0, frame.size.width, frame.size.height), collectionViewLayout: flowlayout)
flowlayout.itemSize = CGSizeMake(frame.size.width, frame.size.height);
flowlayout.minimumInteritemSpacing = 0;
flowlayout.minimumLineSpacing = 0;
flowlayout.scrollDirection = UICollectionViewScrollDirection.Horizontal;
cycleCollectionView!.backgroundColor = UIColor.lightGrayColor()
cycleCollectionView!.pagingEnabled = true
cycleCollectionView!.dataSource = self
cycleCollectionView!.delegate = self
cycleCollectionView!.showsHorizontalScrollIndicator = false
cycleCollectionView!.showsVerticalScrollIndicator = false
cycleCollectionView!.registerClass(ZJCustomCycleCell.self, forCellWithReuseIdentifier: "cellId")
self.addSubview(cycleCollectionView!)
pageControl = UIPageControl.init(frame: CGRectMake(0, 0, frame.size.width / 2, 30))
pageControl.center = CGPointMake(frame.size.width / 2, frame.size.height - 20);
self.addSubview(pageControl);
self.addTimer()
}
定时器初始化
func addTimer(){
let timer1 = NSTimer.init(timeInterval: 2, target: self, selector: "nextPageView", userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(timer1, forMode: NSRunLoopCommonModes)
timer = timer1
}
销毁定时器
func removeTimer(){
self.timer.invalidate()
}
实现循环滚动
func returnIndexPath()->NSIndexPath{
var currentIndexPath = cycleCollectionView!.indexPathsForVisibleItems().last
currentIndexPath = NSIndexPath.init(forRow: (currentIndexPath?.row)!, inSection: sectionNum / 2)
cycleCollectionView!.scrollToItemAtIndexPath(currentIndexPath!, atScrollPosition: UICollectionViewScrollPosition.Left, animated: false)
return currentIndexPath!;
}
func nextPageView(){
let indexPath = self.returnIndexPath()
var item = indexPath.row + 1;
var section = indexPath.section;
if item == images.count {
item = 0
section++
}
self.pageControl.currentPage = item;
let nextIndexPath = NSIndexPath.init(forRow: item, inSection: section)
cycleCollectionView!.scrollToItemAtIndexPath(nextIndexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
}
collectionView Delegate
// 重用池
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
// 这里使用的自定义cell, 下面会贴出自定义cell代码
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellId", forIndexPath: indexPath) as! ZJCustomCycleCell
// 这个Label实现显示数字,表示是第几张图片
cell.labelTitle.text = NSString(format: "%d", indexPath.row) as String
// 这里是图片赋值
let url:String = self.images[indexPath.row] as! String
// 这里我使用的是一个赋值图片的三方库,看自己喜好,为方便我没有自己写
cell.imageView.hnk_setImageFromURL(NSURL.init(string: url)!)
return cell
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return sectionNum
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// 在这里给出了pageControl的数量
pageControl.numberOfPages = images.count
return images.count
}
// 重新添加定时器
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
self.addTimer()
}
// 手动滑动的时候销毁定时器
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
self.removeTimer()
}
设置当前的pagecontrol
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let page = (Int(scrollView.contentOffset.x) / Int(width)) % images.count
pageControl.currentPage = page
}
点击方法
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
self.delegate?.didSelectIndexCollectionViewCell(indexPath.row)
}
下面是我在自定义cell中的代码
var urlImage: String = ""
var imageView = UIImageView()
var labelTitle = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
self.createSubviews(frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createSubviews(frame: CGRect){
imageView = UIImageView.init(frame: CGRectMake(0, 0, frame.size.width, frame.size.height))
self.contentView.addSubview(imageView)
labelTitle = UILabel.init(frame: CGRectMake(10, 10, 30, 30))
imageView.addSubview(labelTitle)
}
封装基本完成了, 下面看看如何使用
// 创建
let cycle = XTCycleScrollView.init(frame: CGRectMake(0, 70, width, 175))
// 要实现点击需要制定代理人
cycle.delegate = self;
// 图片链接数组
let images: NSMutableArray = ["", "", "", ""]
// 数组赋值
cycle.images = images
self.view.addSubview(cycle)
实现代理方法
func didSelectIndexCollectionViewCell(index: Int) {
print("\\(index)")
}
总结: 这样就实现了简单的图片轮播效果,并且带有点击方法, 都看到这里就点个赞吧. 哈哈
原文链接:http://www.jianshu.com/p/f5fa66699a96
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Swift 使用CollectionView 实现图片轮播封装就是这样简单的更多相关文章
- Android 图片轮播(最简单的)
布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android ...
- swift 自定义图片轮播视图
Swift封装图片轮播视图: import UIKit class XHAdLoopView: UIView { private var pageControl : UIPageControl? pr ...
- swift:创建滚动视图的图片轮播器
用swift创建图片轮播器和用OC创建的方式是一样的,都主要用到UIScrollView和UIImageview这两个控件,有几张图片,就将滚动视图的内容区域大小设置为每一张图片的大小乘以张数即可.然 ...
- 如何将angular-ui的图片轮播组件封装成一个指令
在项目开发中我们经常会遇到图片轮播的功能点: 如果我们开发人员自己原生手写,将会花费很多的时间,最终得不偿失. 接下来就详细说说如何使用angular-ui发热图片轮播模块,并且将它写成一个指令(便于 ...
- 基于ionic框架封装一个图片轮播指令的几点
在这里我想在项目中封装一个图片轮播的指令 (本项目使用的是ionic框架) 1)定义指令 define(['app'],function(myapp){ myapp.directive('myslid ...
- 如何将angular-ui-bootstrap的图片轮播组件封装成一个指令
在项目开发中我们经常会遇到图片轮播的功能点: 如果我们开发人员自己原生手写,将会花费很多的时间,最终得不偿失. 接下来就详细说说如何使用angular-ui发热图片轮播模块,并且将它写成一个指令(便于 ...
- iOS开发项目实战——Swift实现图片轮播与浏览
近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...
- UIScrollView实现图片轮播器及其无限循环效果
图片轮播器: 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" ...
- ios之无限 自动 图片轮播器的实现
比较之前发布的手动无限图片轮播器进行了改进.实现了自动无限轮播的功能.比较适合团购标题分类下面的轮播器功能. 实现思路: * 开启一个定时器,把操作放入消息循环池.每隔一定时间,操作执行一次. * 注 ...
随机推荐
- iTween基础之Fade(淡入淡出)
一.基础介绍:二.基础属性 原文地址: http://blog.csdn.net/dingkun520wy/article/details/50923665 一.基础介绍 FadeTo:从当前透明度变 ...
- 安装v2meet客户端 进入会议依然 提示 您还未安装视频会议的客户端,请下载安装
解决办法 1.安装软件,要用管理员权限安装 2.装一个360浏览器,登录会议,这样就成功了.原装IE9却不行. 估计是IE9做了一些安全限制,由于时间关系就没有再处理了.
- 程序开发心理学阅读笔记——第II篇
作为社会行为的软件开发程序开发组->程序开发团队->程序开发项目1.要判断程序员的某个集体是否构成一支团队,要看其中的成员以何种方式相互协作,以共同开发软件产品.2.健康的团队要始终能够保 ...
- 多种方法实现H5网页图片动画效果;
在web开发中,GIF动画效果是随处可见,比如常见的loading加载.人物奔跑的gif图片等等,那么这些都是怎么实现的呢?其实实现的原理很简单,简而言之,这些所谓的动画都是一帧一帧的图片经过一段时间 ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- Codeforces Round #353 (Div. 2) E. Trains and Statistic 线段树+dp
题目链接: http://www.codeforces.com/contest/675/problem/E 题意: 对于第i个站,它与i+1到a[i]的站有路相连,先在求所有站点i到站点j的最短距离之 ...
- hdu 1548 A strange lift 宽搜bfs+优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 There is a strange lift.The lift can stop can at ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- 【BZOJ】【1024】【SCOI2009】生日快乐
枚举 想到以后一秒钟变水题…… 一开始我想:这不是可以随便切吗……但是突然想到:第一刀,必须切在n等分点上!因为要求最后每块的大小相等,那么同理,比如总共要切成7块,第一刀切成了$\frac{3}{7 ...
- java 验证日期