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)

        }

posted @   荣超  阅读(1208)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示