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实现的, ...
随机推荐
- HTML5滑动(swipe)事件
移动H5开发中经常用到滑动效果(页面上移.下移.向左滑动.向右滑动等),浏览器并没有内置swipe事件,可以通过touch事件(touchstart.touchmove和touchend)模拟swip ...
- &和&&
int j = 5,k = 3; if(!(j==k) && (j == 1 + k++ )) { } System.out.println(j); System.out.printl ...
- php : DOM 操作 XML
DOM 操作 XML 基本用法 XML文件: person.XML <?xml version="1.0" encoding="utf-8" ?> ...
- ios framework 分离与合并多种CPU架构,分离与合并模拟器与真机
ios framework 分离与合并多种CPU架构,分离与合并模拟器与真机 如果你所用的framework支持真机和模拟器多种CPU架构,而你需要的是其中的一种或几种,那么可以可以从framewo ...
- 如何解决sublime text 2总是在新窗口中打开文件及文件夹
如何在原窗口打开文件 具体设置:Preferences -> Settings – Default -> 搜索open_files_in_new_window,将其true 改为 fals ...
- rxjava源码分析
RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看 rxjava源码中的线程知识 一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...
- windbg运行
运行起来会提示windbg is running. BUSY 这个是正常运行的状态,只有发生异常,或者被指定断点,才会中断.
- 两个list 合并成新一个list
- Software Engineering: 3. Project planning
recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...
- JAVA开发错误总结(仅记录遇到的错误---后续不断更新......)
=======华丽分割线(工具总结)===================== 1:Maven项目中junit测试找不到主类的问题 Class not found com.test.utils.tes ...