乐虎游戏|乐虎国际登录|欢迎你

Swift-ScrollView轮播图的简易封装和使用

日期:2020-05-05编辑作者:计算机资讯

不多说,轮播图是开发中必要一项技能,直接上代码:

在开发的过程中,很多地方都可以用到轮播图的,这样让用户体验的感觉更加完美。

最近找工作看到大部分的公司都有博客或开源项目的要求,我也寻思着自己写点博客,但是实在是不知道该写些什么东西,太深奥的技术自己也写不明白,所以决定从一些平时开发中应用到的一些控件开始写,开发中遇到的问题到时候也总结写写,一方面可以自己总结,只有学会总结才能更好的进步,以后遇到同样的问题才能不犯错,另一方面也可以给有需要的朋友提供些许的帮助。

先说我的思路:首次继承于UIScrollView类自定义MyScrollView,在MyScrollView里自定制方法,func creatMyScrollView(imageName:[String],height:CGFloat)在里面完成动态布局,通过传入的两个参数imageName,height来制作轮播图的图片和高度,设置contentSize属性和pagingEnabled属性,上代码:

下面这个是我封装的一个简单的轮播图,技术难点很少,只要捋顺了,就很简单了。

今天要写的是一个非常简单但是又常用的控件——轮播图。

首先继承于UIScrollView自定义MyScrollView类

#import<UIKit/UIKit.h>

此轮播图采用的是UIScrollView和PageController以及NSTimer来实现,通过NSTimer来改变UIScrollView的偏移量,然后通过scrollView的偏移量来计算当前的page。在数据源最前面添加一个最后的图片,在最后面添加第一个图片,当scrollView偏移量到最后一张图片时,设置scrollView的偏移量为第二张图片,最终达到循环轮播效果。

class ZYF_MyScrollView: UIScrollView {}

#define kWidth self.frame.size.width

具体代码实现如下:

ZYCycleView.h文件内容

图片 1

h文件定义了ZYCycleView的初始化,轮播图所需的各种属性以及点击轮播图的回调,包括block回调和delegate回调。

以下是实现文件:

初始化ZYCycleView:

图片 2

初始化属性默认值,创建scrollView以及PageControl:

图片 3

创建timer循环图片,每隔scrollTimeInterval改变scroolView的偏移量:

图片 4

懒加载创建scrollView以及pageControl:

图片 5

图片点击事件,UIScrollViewDelegate:

图片 6

图片 7

以上是全部的代码,代码详情:

自定义方法

#define kHeight self.frame.size.height

scrollView的轮播就是利用其偏移量来进行设置,如果实现n张图片自动轮播,创建计时器是必须的,在scrollView中创建n+1张图片,容量也是n+1张图片的容量。让第1张和最后一张是同一张图片,在偏移量达到n*width的时候,让偏移量置零,这样,在即将显示最后一张图的时候,scrollView的展示图片瞬间变成第一张,然后继续往后播。这样形成了我们常见的轮播效果

@interfaceCycleScrollVIew : UIView

class ZYF_MyScrollView: UIScrollView { func creatMyScrollView(imageName:[String],height:CGFloat) { //动态布局 for i in 0...(imageName.count - 1) { let imageView = UIImageView(frame: CGRectMake(CGFloat * width,0,width,height)) self.addSubview(imageView) //设置轮播图图片 imageView.image = UIImage(named: imageName[i]) } //设置轮播图容量 self.contentSize = CGSizeMake(CGFloat(imageName.count ) * width, height) //设置吸附属性 self.bounces = false //设置书页效果 self.pagingEnabled = true //单独创建第n+1张轮播图,和第一张图片是同一张图 let imageView = UIImageView(frame:CGRectMake(CGFloat(imageName.count) * width, 0, width, height)) imageView.image = UIImage(named:imageName[0]) self.addSubview(imageView) }}

//@property (nonatomic, retain) NSArray *imagesArray;

这样就算是简单的封装了一下,使用方法如下:

//@property (nonatomic, retain) UIScrollView *scrollView;

在你要放置的轮播图的.swift文件中生成 ZYF_MyScrollView的对象

/**

let scr = ZYF_MyScrollView()

*根据出入的图片数组,初始化一个轮播图对象

创建图片名称数组

*

let iamgeNames = ["App公测","简书出版","简书官方专题","简书月刊","简书出版","简书官方专题"]

*@param frame轮播图对象的frame

调用creatUI方法,传入图片名称数组,设置高度

*@param imagesArray 图片数组,包含了要进行轮播的图片

func creatScrollView() { let view = UIView(frame: CGRectMake(0,0,UIScreen.mainScreen.bounds.size.width,280)) scr.creatUI(imageNames,height:200) view.addSubView}

*@param animationDuration 自动滚动的时间间隔,如果给的值为0的时候,不能自动进行轮播

到此,一个能够拖动的轮播图就制作结束了,实现自动轮播,下面我们需要借助计时器NSTimer

*@return 初始化完成的轮播图对象

创建NSTimer

*/

 //创建轮播图定时器 func creatTimer() { let timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(self.timerManager), userInfo: nil, repeats: true) //这句话实现多线程,如果你的ScrollView是作为TableView的headerView的话,在拖动tableView的时候让轮播图仍然能轮播就需要用到这句话 NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) } //创建定时器管理者 func timerManager() { //设置偏移量scr.setContentOffset(CGPointMake(scr.contentOffset.x + width, 0), animated: true) //当偏移量达到最后一张的时候,让偏移量置零 if scr.contentOffset.x == CGFloat * CGFloat(imageNames.count) { scr.contentOffset = CGPointMake } }

- (instancetype)initWithFrame:(CGRect)frame imagesArray:(NSArray *)imagesArray animationDuration:(NSTimeInterval)animationDuration;

到此,自动轮播图制作完毕,在使用中还缺少了一个组件,就是小白点UIPageControl,回到func creatScrollView(){}中

@property(nonatomic,retain,readonly) NSArray *imagesArray;

func creatScrollView() { let view = let view = UIView(frame: CGRectMake(0,0,UIScreen.mainScreen.bounds.size.width,280)) scr.creatUI(imageNames,height:200)` view.addSubView let page = UIPageControl() page.frame = CGRectMake(width / 2 - 50,160,100,30) page.numberOfPages = imageNames.count //将小白点放到scr之上 view.insertSubview(page, aboveSubview: scr)}

@end

遵守UIScrollViewDelegate协议,设置小白点的跟随轮动

#import"CycleScrollVIew.h"

 //当手动滚动视图翻页时调用该方法 var cnt = 0 func scrollViewDidEndDecelerating(scrollView: UIScrollView) { let cPage = scr.contentOffset.x / width page.currentPage = Int cnt = Int } //自动播放时,调用该方法 func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { cnt += 1 page.currentPage = cnt % imageNames.count }

#import"NSTimer+Addition.h"

到此,全部工程就完成了

#definekWidth self.frame.size.width

效果如下

#definekHight self.frame.size.hight

图片 8轮播图效果.gif

@interfaceCycleScrollVIew ()

{

NSInteger _imagesCount;// 记录传入的数组元素的个数

NSTimeInterval _animationDuration;// 定义自动滚动的时间间隔

}

@property(nonatomic,retain) NSArray *imagesArray;// 接受传入的图片数组

@property(nonatomic,retain) UIScrollView *scrollView;

@property(nonatomic,retain) NSTimer *timer;//使用NSTimer让图片自动滚动

@end

@implementationCycleScrollVIew

- (instancetype)initWithFrame:(CGRect)frame imagesArray:(NSArray *)imagesArray animationDuration:(NSTimeInterval)animationDuration

{

self= [superinitWithFrame:frame];

if(self) {

_imagesArray = [imagesArray retain];

_imagesCount = imagesArray.count;

// 初始化UIScrollView对象

[selfcreateScrollView];

// 初始化NSTimer对象,并且让它进行滚动,如果给的时间间隔为0的话,那么不能自动滚动

if(animationDuration !=0) {

_timer = [NSTimer scheduledTimerWithTimeInterval:animationDuration target:selfselector:@selector(autoChangeFrame:) userInfo:nilrepeats:YES];

}

}

returnself;

}

- (void)autoChangeFrame:(NSTimer *)timer

{

CGPoint newOffset = CGPointMake(_scrollView.contentOffset.x + kWidth,0);

本文由乐虎游戏发布于计算机资讯,转载请注明出处:Swift-ScrollView轮播图的简易封装和使用

关键词:

第2章第4节界面MVC(下)

稍好点的两全 内容摘要 纯手打.png 地点讲授的亲自过问,通过二个函数就完事了七个简便的多少体现和改产生效,不...

详细>>

Android PopupWindow的使用技巧

内容摘要 TextView 文本框 EditText控件 Button 与 ImageButton ImageView RadioButton CheckBox复选框 PopupWindow是Android上自定义弹出窗口...

详细>>

iOS开荒-下载word/pdf/pages/txt等文件并预览

好久没碰iOS了,前几天回顾了一下之前所做的项目,发现有一些新奇的东西。今天我问来讲讲QuickLook。这个功能用的...

详细>>

Xcode 9.2打包或者调试,iOS 8.2~iOS8.0的系统加载图片扭曲

场景:1、Xcode 9.2调治真机,打包测量检验,或许打包上线2、当前调节和测验的是iOS8.2真机,5S ,iOS8.1模拟器的相干机...

详细>>