Swift-ScrollView轮播图的简易封装和使用
不多说,轮播图是开发中必要一项技能,直接上代码:
先说我的思路:首次继承于UIScrollView类自定义MyScrollView,在MyScrollView里自定制方法,func creatMyScrollView(imageName:[String],height:CGFloat)
在里面完成动态布局,通过传入的两个参数imageName,height来制作轮播图的图片和高度,设置contentSize属性和pagingEnabled属性,上代码:
首先继承于UIScrollView自定义MyScrollView类
class ZYF_MyScrollView: UIScrollView {}
自定义方法
scrollView的轮播就是利用其偏移量来进行设置,如果实现n张图片自动轮播,创建计时器是必须的,在scrollView中创建n+1张图片,容量也是n+1张图片的容量。让第1张和最后一张是同一张图片,在偏移量达到n*width的时候,让偏移量置零,这样,在即将显示最后一张图的时候,scrollView的展示图片瞬间变成第一张,然后继续往后播。这样形成了我们常见的轮播效果
class ZYF_MyScrollView: UIScrollView {
func creatMyScrollView(imageName:[String],height:CGFloat) {
//动态布局
for i in 0...(imageName.count - 1) {
let imageView = UIImageView(frame: CGRectMake(CGFloat(i) * 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)
}
}
这样就算是简单的封装了一下,使用方法如下:
在你要放置的轮播图的.swift文件中生成 ZYF_MyScrollView的对象
let scr = ZYF_MyScrollView()
创建图片名称数组
let iamgeNames = ["App公测","简书出版","简书官方专题","简书月刊","简书出版","简书官方专题"]
调用creatUI方法,传入图片名称数组,设置高度
func creatScrollView() {
let view = UIView(frame: CGRectMake(0,0,UIScreen.mainScreen.bounds.size.width,280))
scr.creatUI(imageNames,height:200)
view.addSubView(scr)
}
到此,一个能够拖动的轮播图就制作结束了,实现自动轮播,下面我们需要借助计时器NSTimer
创建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(width) * CGFloat(imageNames.count) {
scr.contentOffset = CGPointMake(0, 0)
}
}
到此,自动轮播图制作完毕,在使用中还缺少了一个组件,就是小白点UIPageControl,回到func creatScrollView(){}中
func creatScrollView() {
let view = let view = UIView(frame: CGRectMake(0,0,UIScreen.mainScreen.bounds.size.width,280))
scr.creatUI(imageNames,height:200)`
view.addSubView(scr)
let page = UIPageControl()
page.frame = CGRectMake(width / 2 - 50,160,100,30)
page.numberOfPages = imageNames.count
//将小白点放到scr之上
view.insertSubview(page, aboveSubview: scr)
}
遵守UIScrollViewDelegate协议,设置小白点的跟随轮动
//当手动滚动视图翻页时调用该方法
var cnt = 0
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let cPage = scr.contentOffset.x / width
page.currentPage = Int(cPage)
cnt = Int(cPage)
}
//自动播放时,调用该方法
func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
cnt += 1
page.currentPage = cnt % imageNames.count
}
到此,全部工程就完成了
效果如下
Swift-ScrollView轮播图的简易封装和使用的更多相关文章
- swift 广告轮播图
import UIKit import Kingfisher class BannerView: UIView,UIScrollViewDelegate{ enum ImageType{ case I ...
- 用原生js封装轮播图
原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...
- 简要分析javascript的选项卡和轮播图
选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i&l ...
- 初识 swift 封装轮播图
一.简介 换了一家公司.换了一个环境刚开始来公司自然不能有一丝一毫的放松,每天即使是没有什么工作也是看看这个博客.那个源码.尽量让自己更充实.慢慢的开始写几篇博客记录下自己遇到的一些问题和解决方法.其 ...
- 实现下来ScrollView放大轮播图
创建工程,创建一个UIScrollView属性,并遵循其协议: #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self. ...
- swift-自定义无限轮播图
一 前言 1.之前一直在用OC编程,最近才开始接触使用swift就发现使用OC越来越不习惯,感觉已经爱上了swift. 2.这个自定义轮播图只是对之前OC版本进行了翻译,欢迎指正. 3.我决定一步步 ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式
Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式 Fragment FragmentManager frag ...
- iOS swift版本无限滚动轮播图
之前写过oc版本的无限滚动轮播图,现在来一个swift版本全部使用snapKit布局,数字还是pageConrrol样式可选 enum typeStyle: Int { case pageContro ...
随机推荐
- Linux实用命令工具-dtrx根据需要自动解压
刚刚逛网站的时候看到一个命令工具很不错——dtrx. 这个工具能够解压的类型包括tar, zip,rpm, deb, gem, 7z, cpio, rar 等等,并且这个工具能自动识别压缩包类型并进行 ...
- Spring_配置 Bean(1)
- centos7下apache+tomcat整合
前提 在系统中已经安装好了jdk.tomcat.apache #本人博客中jdk安装连接 http://www.cnblogs.com/xhkj/p/6545111.html #本人博客中tomcat ...
- LeetCode——Longest Consecutive Sequence
LeetCode--Longest Consecutive Sequence Question Given an unsorted array of integers, find the length ...
- c++ learning
迟到了三年的学习笔记.. 野指针:造了一个指针,不是NULL或者没有指向正经内存.比如刚造出来又不赋值,并不知道它指向了哪里 内存泄漏:造了一个指针,给他分配了空间,xxxxx,又分配了一块空间,指针 ...
- Android -- 利用ContentProvider 读取和写入短信
1. 读写短信 示例代码 均需要先获得读写短信的权限 <uses-permission android:name="android.permission.WRITE_SMS" ...
- spring3: 对JDBC的支持 之 关系数据库操作对象化
7.3.1 概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...
- Spring 自动装配;方法注入
通过配置defalut—autowire属性,Spring IOC容器可以自动为程序注入Bean:默认是no(不启用自动装配). default—autowire的类型有: byName:通过名称自动 ...
- 内存保护机制及绕过方案——利用未启用SafeSEH模块绕过SafeSEH
前言:之前关于safeSEH保护机制的原理等信息,可在之前的博文(内存保护机制及绕过方案中查看). 利用未启用SafeSEH模块绕过SafeSEH ⑴. 原理分析: 一个不是仅包含中间语言(1L)且 ...
- Idea_00_资源贴
一.精选资料 tengj/IntelliJ-IDEA-Tutorial IntelliJ IDEA 使用教程-极客学院 二.参考资料 eclipse&Myeclipse&Intelli ...