class BannerView: UIView,UIScrollViewDelegate{

 //图⽚⽔平放置到scrollView上
private var scrollView:UIScrollView = UIScrollView()
//⼩圆点标识
private var pageControl:UIPageControl = UIPageControl()
private var imageViews:Array = Array<UIImageView>() //图⽚集合
private var images:Array<String> = []
private var type:ImageType? private var width:CGFloat =
private var height:CGFloat = private var currIndex =
private var clickBlock :(Int)->Void = {index in} private var timer:Timer? // 默认⾃动播放 设置为false只能⼿动滑动
var isAuto = true
// 轮播间隔时间 默认6秒可以⾃⼰修改
var interval:Double = private var startOffsetX:CGFloat = override func layoutSubviews() {
super.layoutSubviews()
} public func setImages(images:Array<String>,type:ImageType
= .Image,imageClickBlock:@escaping (Int) -> Void) {
self.type = type
self.images = images
self.clickBlock = imageClickBlock
self.initLayout()
} private func initLayout(){
if(self.images.count == ){
return
} width = self.bounds.width
height = self.bounds.height scrollView.frame = self.bounds
scrollView.contentSize = CGSize(width:width * CGFloat(images.count +
),height:height)
scrollView.contentOffset = CGPoint(x:width,y:)
scrollView.isUserInteractionEnabled = true
scrollView.isPagingEnabled = true
scrollView.showsHorizontalScrollIndicator = false
scrollView.delegate = self
self.addSubview(scrollView) var image = UIImageView()
image.frame = CGRect(x:,y:,width:width,height:height)
image.contentMode = .scaleToFill
image.isUserInteractionEnabled = true
setImage(image: image, index: images.count - )
scrollView.addSubview(image)
for i in ... images.count{
let image = UIImageView()
image.frame = CGRect(x:width *
CGFloat(i),y:,width:width,height:height)
image.contentMode = .scaleToFill
image.isUserInteractionEnabled = true
scrollView.addSubview(image)
setImage(image: image, index: i - )
addTapGesWithImage(image: image)
}
image = UIImageView()
image.frame = CGRect(x:width * CGFloat(images.count +
),y:,width:width,height:height)
image.contentMode = .scaleToFill
image.isUserInteractionEnabled = true
scrollView.addSubview(image)
setImage(image: image, index: ) pageControl.center = CGPoint(x:width/,y:height - CGFloat())
pageControl.isEnabled = true
pageControl.numberOfPages = images.count
pageControl.currentPageIndicatorTintColor = UIColor.green
pageControl.pageIndicatorTintColor = UIColor.gray
pageControl.isUserInteractionEnabled = false
self.addSubview(pageControl)
if(isAuto){
openTimer()
}
setCurrent(currIndex: )
} private func setImage(image:UIImageView,index:Int){
if(type == .Image){
image.image = UIImage.init(named:images[index])
}else{
image.setMyImage(url: images[index])
}
} func setCurrent(currIndex:Int) {
if(currIndex < ){
self.currIndex = images.count -
}else{
self.currIndex = currIndex
}
pageControl.currentPage = self.currIndex
scrollView.setContentOffset(CGPoint(x:width * CGFloat(self.currIndex +
),y:), animated: false)
} //给图⽚添加点击⼿势
private func addTapGesWithImage(image:UIImageView) {
let tap = UITapGestureRecognizer(target: self, action: #selector(tap(_:)))
image.isUserInteractionEnabled = true //让控件可以触发交互事件
image.contentMode = .scaleToFill
// image.clipsToBounds = true //超出⽗控件的部分不显示
image.addGestureRecognizer(tap)
} //点击图⽚,调⽤block
@objc func tap(_ ges:UITapGestureRecognizer) {
clickBlock((ges.view?.tag)!)
} func scrollViewDidScroll(_ scrollView: UIScrollView) { } func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
startOffsetX = scrollView.contentOffset.x
closeTimer()
} func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate
decelerate: Bool) {
} func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if(scrollView.contentOffset.x > startOffsetX){
currIndex = (currIndex + ) % images.count
}else{
currIndex = (currIndex - ) % images.count
}
setCurrent(currIndex: currIndex)
openTimer()
} func openTimer(){
if(isAuto){
closeTimer()
timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector:
#selector(startAutoScroll), userInfo: nil, repeats: true)
}
} func closeTimer(){
if(timer != nil){
timer?.invalidate()
timer = nil
}
} @objc func startAutoScroll(){
if(isDisplayInScreen()){
setCurrent(currIndex: (currIndex + ) % images.count)
}
} func isDisplayInScreen() -> Bool{
if(self.window == nil){
return false
}
return true
} }
enum ImageType{
case Image //本地图⽚
case URL //URL
}
  

swift bannerview 广告轮播图的更多相关文章

  1. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. JavaScripts广告轮播图以及定时弹出和定时隐藏广告

    轮播图: 函数绑定在body标签内 采用3张图,1.jpg   2.jpg  3.jpg  利用定时任务执行设置图片属性 src  利用for循环可以完成3秒一次 一替换. 定时弹出广告: 由于bod ...

  3. android中广告轮播图总结

    功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...

  4. jquery 广告轮播图

    轮播图 /*轮播图基本功能: * 1图片切换 * 1.1图片在中间显示 * 1.2图片淡入淡出 * 2左右各有一个按钮 * 2.1点击左按钮,图片切换上一张 * 2.2点击右按钮,图片切换下一张 * ...

  5. swift 广告轮播图

    import UIKit import Kingfisher class BannerView: UIView,UIScrollViewDelegate{ enum ImageType{ case I ...

  6. android-auto-scroll-view-pager (无限广告轮播图)

    github 地址: https://github.com/Trinea/android-auto-scroll-view-pager Gradle: compile ('cn.trinea.andr ...

  7. Android广告轮播图实现

    先看效果 第一步,布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln ...

  8. Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

    最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面 ...

  9. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

随机推荐

  1. leetcode 正则表达式 (动态规划)

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的 ...

  2. 51NOD1050 循环数组最大字段和

    N个整数组成的循环序列a11,a22,a33,…,ann,求该序列如aii+ai+1i+1+…+ajj的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑an−1n−1,ann,a11, ...

  3. Mac修改用户名后程序配置和文件都找不到了?

    小编今天手残,修改mac 的用户名,幸亏文件没丢失,要不然配置程序估计至少要花费周末的两天时间了.. 所幸的是,各种Google,终于找回了原用户名下的所有配置. 接下来,讲讲小编如何入坑又如何脱坑的 ...

  4. phi

    给定 \(T\) 个正整数 \(n\) ,对于每个 \(n\) ,输出做小的 \(m\) ,使得 \(\phi (m)\ge n\). 思路1:搞个线性欧拉函数筛,后缀最大值,二分查找 思路2:直接求 ...

  5. PHP日期函数

    在正式学习日期函数前大家得了解几个概念: 1.时区 2.世界时 3.unix时间戳 时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的.1884年 ...

  6. MySQL新增数据,存在就更新,不存在就添加

    1.插入一条数据,存在就更新,不存在就更新(必须现有唯一键)使用insert ignore语句: insert ignore into table(col1,col2) values ('a','b' ...

  7. MyBatis:一对多、多对一处理

    多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` INT( ...

  8. LVS三种模式区别

    参考文档 http://www.magedu.com/65436.html 名词:CIP 客户端IP地址   VIP:即DS服务器上的代理IP地址,也是客户端访问的执行IP地址 1.NAT模式 ①.客 ...

  9. Api_hook 拦截 messageBox 等函数

    library hookdll; uses SysUtils, Windows, Classes, unitHook in 'unitHook.pas'; {$R *.res} const HOOK_ ...

  10. Java模板引擎之Freemarker 学习笔记 一

    什么是Freemarker Freemarker是模板引擎,不是Web框架,只是视图层的组件,官网是 https://freemarker.apache.org/ Freemarker原理 数据模型+ ...