//
|
// CommonBannerView.swift
|
// WanPai
|
//
|
// Created by 无故事王国 on 2023/6/30.
|
//
|
|
import UIKit
|
import SDWebImage
|
|
class CommonBannerView: 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 = 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
|
// 轮播间隔时间 默认6秒可以⾃⼰修改
|
var interval:Double = 3
|
|
private var startOffsetX:CGFloat = 0
|
private var fillBounds:CGRect?
|
|
override func layoutSubviews() {
|
super.layoutSubviews()
|
}
|
|
public func setImages(images:Array<String>,type:ImageType
|
= .Image,fillBounds:CGRect? = nil,imageClickBlock:@escaping (Int) -> Void) {
|
self.type = type
|
self.fillBounds = fillBounds
|
self.images = images
|
self.clickBlock = imageClickBlock
|
self.initLayout()
|
}
|
|
private func initLayout(){
|
if(self.images.count == 0){
|
return
|
}
|
|
if fillBounds != nil{
|
width = fillBounds!.width
|
height = fillBounds!.height
|
scrollView.frame = CGRect(origin: .zero, size: fillBounds!.size)
|
}else{
|
width = self.bounds.width
|
height = self.bounds.height
|
scrollView.frame = self.bounds
|
}
|
|
scrollView.contentSize = CGSize(width:width * CGFloat(images.count +
|
2),height:height)
|
scrollView.contentOffset = CGPoint(x:width,y:0)
|
scrollView.isUserInteractionEnabled = true
|
scrollView.isPagingEnabled = true
|
scrollView.isScrollEnabled = images.count > 1
|
scrollView.contentInsetAdjustmentBehavior = .never
|
scrollView.showsHorizontalScrollIndicator = false
|
scrollView.delegate = self
|
self.addSubview(scrollView)
|
|
var image = UIImageView()
|
image.sizeToFit()
|
image.frame = CGRect(x:0,y:0,width:width,height:height)
|
image.contentMode = .scaleToFill
|
image.isUserInteractionEnabled = true
|
setImage(image: image, index: images.count - 1)
|
scrollView.addSubview(image)
|
for i in 1 ... images.count{
|
let image = UIImageView()
|
image.frame = CGRect(x:width *
|
CGFloat(i),y:0,width:width,height:height)
|
image.contentMode = .scaleToFill
|
image.isUserInteractionEnabled = true
|
scrollView.addSubview(image)
|
setImage(image: image, index: i - 1)
|
addTapGesWithImage(image: image)
|
}
|
image = UIImageView()
|
image.sizeToFit()
|
image.frame = CGRect(x:width * CGFloat(images.count +
|
1),y:0,width:width,height:height)
|
image.contentMode = .scaleToFill
|
image.isUserInteractionEnabled = true
|
scrollView.addSubview(image)
|
setImage(image: image, index: 0)
|
|
// pageControl.center = CGPoint(x:width/2,y:height - CGFloat(15))
|
pageControl.isEnabled = true
|
pageControl.numberOfPages = images.count
|
pageControl.currentPageIndicatorTintColor = UIColor.white
|
pageControl.pageIndicatorTintColor = UIColor.gray.withAlphaComponent(0.5)
|
pageControl.isUserInteractionEnabled = false
|
pageControl.isHidden = images.count == 1
|
self.addSubview(pageControl)
|
pageControl.snp.makeConstraints { make in
|
make.bottom.equalToSuperview().offset(0)
|
make.centerX.equalToSuperview()
|
}
|
|
//当前显示的只有 center_image 其他两个只是⽤来增加滑动时效果⽽已,不
|
//addTapGesWithImage(image: center_image)
|
if(isAuto){
|
openTimer()
|
}
|
setCurrent(currIndex: 0)
|
}
|
|
private func setImage(image:UIImageView,index:Int){
|
if(type == .Image){
|
image.image = UIImage.init(named:images[index])
|
}else{
|
image.sd_setImage(with: URL(string: images[index]))
|
}
|
}
|
|
func setCurrent(currIndex:Int,animate:Bool = false) {
|
if(currIndex < 0){
|
self.currIndex = images.count - 1
|
}else{
|
self.currIndex = currIndex
|
}
|
pageControl.currentPage = self.currIndex
|
|
if animate{
|
scrollView.setContentOffset(CGPoint(x:width * CGFloat(self.currIndex + 1),y:0), 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 + 1) % images.count
|
}else{
|
currIndex = (currIndex - 1) % 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 + 1) % images.count,animate: true)
|
}
|
}
|
|
func isDisplayInScreen() -> Bool{
|
if(self.window == nil){
|
return false
|
}
|
return true
|
}
|
|
}
|
enum ImageType{
|
case Image //本地图⽚
|
case URL //URL
|
|
}
|