// // Virgil_PagedView.swift // 轮播图片 // // Created by virgil on 16/3/31. // Copyright © 2016年 virgil. All rights reserved. // import UIKit class Virgil_PagedView: UIView, UIScrollViewDelegate { private var tapItemClosure: TapItemClosure? private var scrollView: UIScrollView! weak var delegate: Virgil_PagedViewDelegate? private var imageViewCount = 0 var imgs: NSMutableArray! var titles: NSArray = ["爱跑腿", "青城校园", "青城校园", "爱跑腿", "爱跑腿"] var titleLabel: UILabel? var pageControl = UIPageControl() ///初始化方法 /// /// - parameter frame :frame /// - parameter images :UIImage数组 /// - parameter timeInterval :循环时间 init(frame: CGRect, images: [UIImage], timeInterval: Double) { super.init(frame: frame) scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: images as NSArray?, timeInterval: timeInterval, imageURLStrings: nil, placeholderImage: nil) } ///初始化方法closure /// /// - parameter frame :frame /// - parameter images :UIImage数组 /// - parameter timeInterval :循环时间 /// - parameter tapItemClosure :closure实现点击事件 init(frame: CGRect, images: [UIImage], timeInterval: Double, tapItemClosure:@escaping TapItemClosure) { super.init(frame: frame) self.tapItemClosure = tapItemClosure scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: images as NSArray?, timeInterval: timeInterval, imageURLStrings: nil, placeholderImage: nil) } ///初始化方法URL /// /// - parameter frame :frame /// - parameter imageURLStrings :url字符串数组 /// - parameter timeInterval :循环时间 init(frame: CGRect, imageURLStrings: [String], timeInterval: Double) { super.init(frame: frame) scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: nil) } ///初始化方法URL&Closure /// /// - parameter frame :frame /// - parameter imageURLStrings :url字符串数组 /// - parameter timeInterval :循环时间 /// - parameter tapItemClosure :closure实现点击事件 init(frame: CGRect, imageURLStrings: [String], timeInterval: Double, tapItemClosure:@escaping TapItemClosure) { super.init(frame: frame) self.tapItemClosure = tapItemClosure scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: nil) } ///初始化方法URL /// /// - parameter frame :frame /// - parameter imageURLStrings :url字符串数组 /// - parameter placeholderImage :加载中图片 /// - parameter timeInterval :循环时间 init(frame: CGRect, imageURLStrings: [String], placeholderImage: UIImage, timeInterval: Double) { super.init(frame: frame) scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: placeholderImage) } ///初始化方法URL&Closure /// /// - parameter frame :frame /// - parameter imageURLStrings :url字符串数组 /// - parameter placeholderImage :加载中图片 /// - parameter timeInterval :循环时间 /// - parameter tapItemClosure :closure实现点击事件 init(frame: CGRect, imageURLStrings: [String], placeholderImage: UIImage, timeInterval: Double, tapItemClosure:@escaping TapItemClosure) { super.init(frame: frame) self.tapItemClosure = tapItemClosure scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: placeholderImage) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: 初始化 private func initializeImageViews(images: NSArray?, timeInterval: Double, imageURLStrings: NSArray?, placeholderImage: UIImage?) { self.scrollView.isPagingEnabled = true self.scrollView.delegate = self self.scrollView.showsHorizontalScrollIndicator = false self.scrollView.showsVerticalScrollIndicator = false //view宽度&高度 let viewWidth = self.scrollView.frame.size.width let viewHeight = self.scrollView.frame.size.height var count = 0 if images != nil { imageViewCount = images!.count //计算设置view的总内容宽度 self.scrollView.contentSize = CGSize(width: viewWidth * CGFloat(images!.count + 2), height: viewHeight) count = images!.count } else { imageViewCount = imageURLStrings!.count //计算设置view的总内容宽度 self.scrollView.contentSize = CGSize(width: viewWidth * CGFloat(imageURLStrings!.count + 2), height: viewHeight) count = imageURLStrings!.count } //将数组数据加入到view中 //第一张图片位置放最后一张 //最后一张图片位置放第一张 for i in 0 ..< count + 2 { if i == 0 { //第一个位置,放最后一张图片 let imageView: UIImageView if images != nil { imageView = UIImageView(image: images!.lastObject as? UIImage) } else { imageView = UIImageView(image: placeholderImage) imageView.sd_setImage(with: NSURL(string: imageURLStrings!.lastObject as! String)! as URL, placeholderImage: placeholderImage!) } imageView.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight) self.scrollView.addSubview(imageView) let btn = UIButton(type: .custom) btn.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight) btn.tag = i btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside) self.scrollView.addSubview(btn) } else if i == count + 1 { //最后一个位置,放第一张图片 let imageView: UIImageView if images != nil { imageView = UIImageView(image: images!.firstObject as? UIImage) } else { imageView = UIImageView(image: placeholderImage) imageView.sd_setImage(with: NSURL(string: imageURLStrings!.firstObject as! String)! as URL, placeholderImage: placeholderImage!) } imageView.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight) self.scrollView.addSubview(imageView) let btn = UIButton(type: .custom) btn.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight) btn.tag = i btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside) self.scrollView.addSubview(btn) } else { //如果i = 1,则为第二个位置,放第一张图片,以此类推 let imageView: UIImageView if images != nil { imageView = UIImageView(image: images![i - 1] as? UIImage) } else { imageView = UIImageView(image: placeholderImage) imageView.sd_setImage(with: (NSURL(string: imageURLStrings![i - 1] as! String)! as NSURL) as URL, placeholderImage: placeholderImage!) } imageView.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight) self.scrollView.addSubview(imageView) let btn = UIButton(type: .custom) btn.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight) btn.tag = i btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside) self.scrollView.addSubview(btn) } } //设置view默认显示第二张图片的位置 self.scrollView.setContentOffset(CGPoint(x: viewWidth, y: 0), animated: false) self.addSubview(scrollView) //计时器 let timer = Timer(timeInterval: timeInterval, target: self, selector: #selector(Virgil_PagedView.loop), userInfo: nil, repeats: true) RunLoop.current.add(timer, forMode: RunLoop.Mode.default) addBottomView() } func addBottomView() { let view = UIView(frame: CGRect(x: 0, y: self.frame.size.height - 20, width: self.frame.size.width, height: 20)) // view.backgroundColor = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.4) // self.addSubview(view) // pageControl.frame = CGRect(x: (view.frame.size.width - CGFloat(imageViewCount * 20)) / 2, y: 0, width: CGFloat(imageViewCount * 20), height: 20) pageControl.numberOfPages = imageViewCount pageControl.currentPage = 0 pageControl.currentPageIndicatorTintColor = CommonUntils.getUIColorFromRGB(rgbValue: 0xffffff, alpha: 1.0) pageControl.pageIndicatorTintColor = CommonUntils.getUIColorFromRGB(rgbValue: 0xffffff, alpha: 0.6) view.addSubview(pageControl) } // MARK: 计时器方法 @objc func loop() { let width = scrollView.frame.size.width let page = floor((scrollView.contentOffset.x - width/2)/width) + 1 self.pageControl.currentPage = NSInteger(page) scrollView.setContentOffset(CGPoint(x: width * CGFloat(page + 1), y: 0), animated: true) } // MARK: - scrollView Delegate func scrollViewDidScroll(_ scrollView: UIScrollView) { if (Int(scrollView.contentOffset.x) % Int(scrollView.frame.size.width)) == 0 { let width = scrollView.frame.size.width let page = floor((scrollView.contentOffset.x - width/2)/width) + 1 if page == 0 { scrollView.setContentOffset(CGPoint(x: width * CGFloat(imageViewCount), y: 0), animated: false) self.pageControl.currentPage = imageViewCount - 1 titleLabel?.text = titles[imageViewCount - 1] as? String } else if page >= CGFloat(imageViewCount + 1) { scrollView.setContentOffset(CGPoint(x: width, y: 0), animated: false) self.pageControl.currentPage = NSInteger(0) titleLabel?.text = titles[0] as? String } else { self.pageControl.currentPage = NSInteger(page - 1) titleLabel?.text = titles[Int(page - 1)] as? String } } } // MARK: btn点击 @objc internal func btnClick(btn: AnyObject) { if btn.tag == 0 { //第一按钮对应最后一个 if delegate != nil { delegate?.didTapItem?(item: imageViewCount - 1) } if tapItemClosure != nil { tapItemClosure!(imageViewCount - 1) } } else if btn.tag == imageViewCount + 1 { //最后一个按钮对应第一个 if delegate != nil { delegate?.didTapItem?(item: 0) } if tapItemClosure != nil { tapItemClosure!(0) } } else { //正常对应 tag - 1 == i if delegate != nil { delegate?.didTapItem?(item: btn.tag - 1) } if tapItemClosure != nil { tapItemClosure!(btn.tag - 1) } } } } @objc public protocol Virgil_PagedViewDelegate { @objc optional func didTapItem(item: Int) }