123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- //
- // 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)
- }
|