swift 广告轮播图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | import UIKit import Kingfisher class BannerView : UIView , UIScrollViewDelegate { enum ImageType { case Image //本地图片 case URL //URL } //图片水平放置到scrollView上 private var scrollView : UIScrollView = UIScrollView () //小圆点标识 private var pageControl : UIPageControl = UIPageControl () private var center_image : UIImageView = UIImageView () private var first_image : UIImageView = UIImageView () private var second_image : UIImageView = UIImageView () //图片集合 private var images : Array < String > = [] private var type : ImageType = . Image private var width : CGFloat = 0 private var height : CGFloat = 0 private var currIndex = 0 private var clickBlock :( Int )- > Void = { index in } private var timer : Timer ? // 默认自动播放 设置为false只能手动滑动 var isAuto = true // 轮播间隔时间 默认4秒可以自己修改 var interval : Double = 4 override func layoutSubviews () { super . layoutSubviews () // self.initLayout() } 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 == 0 ){ return } width = frame . size . width height = frame . size . height scrollView . frame = self . bounds scrollView . contentSize = CGSize ( width : width * CGFloat ( 3 ), height : height ) scrollView . contentOffset = CGPoint ( x : width , y : 0 ) scrollView . isUserInteractionEnabled = true scrollView . isPagingEnabled = true scrollView . showsHorizontalScrollIndicator = false scrollView . delegate = self addSubview ( scrollView ) first_image . frame = CGRect ( x : 0 , y : 0 , width : width , height : height ) first_image . contentMode = . scaleAspectFill first_image . isUserInteractionEnabled = true scrollView . addSubview ( first_image ) center_image . frame = CGRect ( x : width , y : 0 , width : width , height : height ) center_image . contentMode = . scaleAspectFill center_image . isUserInteractionEnabled = true scrollView . addSubview ( center_image ) second_image . frame = CGRect ( x : width * 2.0 , y : 0 , width : width , height : height ) second_image . contentMode = . scaleAspectFill second_image . isUserInteractionEnabled = true scrollView . addSubview ( second_image ) pageControl . center = CGPoint ( x : width / 2 , y : height - CGFloat ( 15 )) pageControl . isEnabled = true pageControl . numberOfPages = images . count pageControl . currentPageIndicatorTintColor = UIColor . green pageControl . pageIndicatorTintColor = UIColor . gray pageControl . isUserInteractionEnabled = false addSubview ( pageControl ) //当前显示的只有 center_image 其他两个只是用来增加滑动时效果而已,不需要添加点击事件 addTapGesWithImage ( image : center_image ) if ( isAuto ){ openTimer () } setCurrent ( currIndex : 0 ) } func setCurrent ( currIndex : Int ) { self . currIndex = currIndex if ( type == . Image ){ center_image . image = UIImage . init ( named : images [ currIndex ]) first_image . image = UIImage . init ( named : images [( currIndex - 1 + images . count ) % images . count ]) second_image . image = UIImage . init ( named : images [( currIndex + 1 ) % images . count ]) } else { center_image . setMyImage ( URL : NSURL ( string : images [ currIndex ])) first_image . setMyImage ( URL : NSURL ( string : images [( currIndex - 1 + images . count ) % images . count ])) second_image . setMyImage ( URL : NSURL ( string : images [( currIndex + 1 ) % images . count ])) } center_image . tag = currIndex pageControl . currentPage = currIndex scrollView . setContentOffset ( CGPoint ( x : width , y : 0 ), animated : false ) } //给图片添加点击手势 private func addTapGesWithImage ( image : UIImageView ) { let tap = UITapGestureRecognizer ( target : self , action : # selector ( tap ( _ :))) image . isUserInteractionEnabled = true //让控件可以触发交互事件 image . contentMode = . scaleAspectFill image . clipsToBounds = true //超出父控件的部分不显示 image . addGestureRecognizer ( tap ) } //点击图片,调用block @objc func tap ( _ ges : UITapGestureRecognizer ) { clickBlock (( ges . view ?. tag )!) } func scrollViewDidScroll ( _ scrollView : UIScrollView ) { } func scrollViewWillBeginDragging ( _ scrollView : UIScrollView ) { closeTimer () } func scrollViewDidEndDragging ( _ scrollView : UIScrollView , willDecelerate decelerate : Bool ) { openTimer () } func scrollViewDidEndDecelerating ( _ scrollView : UIScrollView ) { if ( scrollView . contentOffset . x > 0 ){ currIndex = ( currIndex + 1 ) % images . count } else { currIndex = ( currIndex - 1 + images . count ) % images . count } setCurrent ( currIndex : currIndex ) } func openTimer (){ if ( isAuto ){ if ( timer == nil ){ 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 + 1 ) % images . count ) } } func isDisplayInScreen () - > Bool { if ( self . window == nil ){ return false } return true } } extension UIImageView { // Kingfisher的覆盖 好处:1.不用所有界面都去导入 2.如果KingfisherAPI更新或者更换图片加载库可以更方便一些,保持方法名和第一个参数不变,修改一下就能达到目的,比如修改为使用SDWebImage public func setMyImage ( URL : NSURL ?, placeholderImage : Image ? = nil , optionsInfo : KingfisherOptionsInfo ? = nil , progressBlock : DownloadProgressBlock ? = nil , completionHandler : CompletionHandler ? = nil ){ kf . setImage ( with : URL as ? Resource , placeholder : placeholderImage , options : optionsInfo , progressBlock : progressBlock , completionHandler : completionHandler ) } } |
使用方法
@IBOutlet weak var bannerView: BannerView!
bannerView.setImages(images: ["ad01.jpg","ad02.jpg","ad03.jpg","ad04.jpg"]){ (index) in
print(index)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端