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 ...
随机推荐
- 0927—MySQL常用语句集合
一.连接MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysql bin,再键入命令mysql ...
- windows技巧--一次关闭所有资源管理器目录,文件夹目录
每天开机工作一段时间以后,你可能会和我一样,打开了很多的文件目录,于是一个一个的点窗口关闭.于是想有没有一次关闭所有目录的办法~~咚咚咚,经过一番寻觅,下面是我找到的办法 新建bat文件 close_ ...
- SQL中比较好的For xml 用法实例
--包裹单号 入库时间 交易号 商品分类 商品名称 实付款SELECT a.DeliveryCode AS '包裹单号',a.DomesticWarehouseInTime AS '入库时间',a.T ...
- Word Search, 在矩阵中寻找字符串,回溯算法
问题描述: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...
- 摘录:Jetty 的工作原理以及与 Tomcat 的比较
引子:Jetty 应该是目前最活跃也是很有前景的一个 Servlet 引擎.本文将介绍 Jetty 基本架构与基本的工作原理:您将了解到 Jetty 的基本体系结构:Jetty 的启动过程:Jetty ...
- java-登陆界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 阻止a标签跳转四种方法 兼容各大浏览器(包括IE)
阻止a标签跳转四种方法 兼容各大浏览器(包括IE) HTML <!--第一种--> <a href="javascript:;">我不会被跳转</a& ...
- 【C#基本功】1》panel的C#用法 panel
上面截图是panel在labview中的用法,在labview中panel加动态调用技术可以解决很多难题. 对于刚刚接触C#的我来说,如何实现pannel动态加载界面,也是一个必须首要克服的难点. 经 ...
- uva 10891 区间dp+记忆化搜索
https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...
- Java Maven项目使用CXF插件生成WebService代理
CXF生成代理类插件名称:cxf-codegen-plugin 实现功能: 指定代理类所在的包 生成soapheader 操作: eclipse中run as -> maven build -& ...