Virgil_PagedView.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. //
  2. // Virgil_PagedView.swift
  3. // 轮播图片
  4. //
  5. // Created by virgil on 16/3/31.
  6. // Copyright © 2016年 virgil. All rights reserved.
  7. //
  8. import UIKit
  9. class Virgil_PagedView: UIView, UIScrollViewDelegate {
  10. private var tapItemClosure: TapItemClosure?
  11. private var scrollView: UIScrollView!
  12. weak var delegate: Virgil_PagedViewDelegate?
  13. private var imageViewCount = 0
  14. var imgs: NSMutableArray!
  15. var titles: NSArray = ["爱跑腿", "青城校园", "青城校园", "爱跑腿", "爱跑腿"]
  16. var titleLabel: UILabel?
  17. var pageControl = UIPageControl()
  18. ///初始化方法
  19. ///
  20. /// - parameter frame :frame
  21. /// - parameter images :UIImage数组
  22. /// - parameter timeInterval :循环时间
  23. init(frame: CGRect, images: [UIImage], timeInterval: Double) {
  24. super.init(frame: frame)
  25. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  26. initializeImageViews(images: images as NSArray?, timeInterval: timeInterval, imageURLStrings: nil, placeholderImage: nil)
  27. }
  28. ///初始化方法closure
  29. ///
  30. /// - parameter frame :frame
  31. /// - parameter images :UIImage数组
  32. /// - parameter timeInterval :循环时间
  33. /// - parameter tapItemClosure :closure实现点击事件
  34. init(frame: CGRect, images: [UIImage], timeInterval: Double, tapItemClosure:@escaping TapItemClosure) {
  35. super.init(frame: frame)
  36. self.tapItemClosure = tapItemClosure
  37. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  38. initializeImageViews(images: images as NSArray?, timeInterval: timeInterval, imageURLStrings: nil, placeholderImage: nil)
  39. }
  40. ///初始化方法URL
  41. ///
  42. /// - parameter frame :frame
  43. /// - parameter imageURLStrings :url字符串数组
  44. /// - parameter timeInterval :循环时间
  45. init(frame: CGRect, imageURLStrings: [String], timeInterval: Double) {
  46. super.init(frame: frame)
  47. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  48. initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: nil)
  49. }
  50. ///初始化方法URL&Closure
  51. ///
  52. /// - parameter frame :frame
  53. /// - parameter imageURLStrings :url字符串数组
  54. /// - parameter timeInterval :循环时间
  55. /// - parameter tapItemClosure :closure实现点击事件
  56. init(frame: CGRect, imageURLStrings: [String], timeInterval: Double, tapItemClosure:@escaping TapItemClosure) {
  57. super.init(frame: frame)
  58. self.tapItemClosure = tapItemClosure
  59. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  60. initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: nil)
  61. }
  62. ///初始化方法URL
  63. ///
  64. /// - parameter frame :frame
  65. /// - parameter imageURLStrings :url字符串数组
  66. /// - parameter placeholderImage :加载中图片
  67. /// - parameter timeInterval :循环时间
  68. init(frame: CGRect, imageURLStrings: [String], placeholderImage: UIImage, timeInterval: Double) {
  69. super.init(frame: frame)
  70. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  71. initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: placeholderImage)
  72. }
  73. ///初始化方法URL&Closure
  74. ///
  75. /// - parameter frame :frame
  76. /// - parameter imageURLStrings :url字符串数组
  77. /// - parameter placeholderImage :加载中图片
  78. /// - parameter timeInterval :循环时间
  79. /// - parameter tapItemClosure :closure实现点击事件
  80. init(frame: CGRect, imageURLStrings: [String], placeholderImage: UIImage, timeInterval: Double, tapItemClosure:@escaping TapItemClosure) {
  81. super.init(frame: frame)
  82. self.tapItemClosure = tapItemClosure
  83. scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
  84. initializeImageViews(images: nil, timeInterval: timeInterval, imageURLStrings: imageURLStrings as NSArray?, placeholderImage: placeholderImage)
  85. }
  86. required init?(coder aDecoder: NSCoder) {
  87. fatalError("init(coder:) has not been implemented")
  88. }
  89. // MARK: 初始化
  90. private func initializeImageViews(images: NSArray?, timeInterval: Double, imageURLStrings: NSArray?, placeholderImage: UIImage?) {
  91. self.scrollView.isPagingEnabled = true
  92. self.scrollView.delegate = self
  93. self.scrollView.showsHorizontalScrollIndicator = false
  94. self.scrollView.showsVerticalScrollIndicator = false
  95. //view宽度&高度
  96. let viewWidth = self.scrollView.frame.size.width
  97. let viewHeight = self.scrollView.frame.size.height
  98. var count = 0
  99. if images != nil {
  100. imageViewCount = images!.count
  101. //计算设置view的总内容宽度
  102. self.scrollView.contentSize = CGSize(width: viewWidth * CGFloat(images!.count + 2), height: viewHeight)
  103. count = images!.count
  104. } else {
  105. imageViewCount = imageURLStrings!.count
  106. //计算设置view的总内容宽度
  107. self.scrollView.contentSize = CGSize(width: viewWidth * CGFloat(imageURLStrings!.count + 2), height: viewHeight)
  108. count = imageURLStrings!.count
  109. }
  110. //将数组数据加入到view中
  111. //第一张图片位置放最后一张
  112. //最后一张图片位置放第一张
  113. for i in 0 ..< count + 2 {
  114. if i == 0 {
  115. //第一个位置,放最后一张图片
  116. let imageView: UIImageView
  117. if images != nil {
  118. imageView = UIImageView(image: images!.lastObject as? UIImage)
  119. } else {
  120. imageView = UIImageView(image: placeholderImage)
  121. imageView.sd_setImage(with: NSURL(string: imageURLStrings!.lastObject as! String)! as URL, placeholderImage: placeholderImage!)
  122. }
  123. imageView.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
  124. self.scrollView.addSubview(imageView)
  125. let btn = UIButton(type: .custom)
  126. btn.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
  127. btn.tag = i
  128. btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside)
  129. self.scrollView.addSubview(btn)
  130. } else if i == count + 1 {
  131. //最后一个位置,放第一张图片
  132. let imageView: UIImageView
  133. if images != nil {
  134. imageView = UIImageView(image: images!.firstObject as? UIImage)
  135. } else {
  136. imageView = UIImageView(image: placeholderImage)
  137. imageView.sd_setImage(with: NSURL(string: imageURLStrings!.firstObject as! String)! as URL, placeholderImage: placeholderImage!)
  138. }
  139. imageView.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight)
  140. self.scrollView.addSubview(imageView)
  141. let btn = UIButton(type: .custom)
  142. btn.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight)
  143. btn.tag = i
  144. btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside)
  145. self.scrollView.addSubview(btn)
  146. } else {
  147. //如果i = 1,则为第二个位置,放第一张图片,以此类推
  148. let imageView: UIImageView
  149. if images != nil {
  150. imageView = UIImageView(image: images![i - 1] as? UIImage)
  151. } else {
  152. imageView = UIImageView(image: placeholderImage)
  153. imageView.sd_setImage(with: (NSURL(string: imageURLStrings![i - 1] as! String)! as NSURL) as URL, placeholderImage: placeholderImage!)
  154. }
  155. imageView.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight)
  156. self.scrollView.addSubview(imageView)
  157. let btn = UIButton(type: .custom)
  158. btn.frame = CGRect(x: viewWidth * CGFloat(i), y: 0, width: viewWidth, height: viewHeight)
  159. btn.tag = i
  160. btn.addTarget(self, action: #selector(Virgil_PagedView.btnClick), for: .touchUpInside)
  161. self.scrollView.addSubview(btn)
  162. }
  163. }
  164. //设置view默认显示第二张图片的位置
  165. self.scrollView.setContentOffset(CGPoint(x: viewWidth, y: 0), animated: false)
  166. self.addSubview(scrollView)
  167. //计时器
  168. let timer = Timer(timeInterval: timeInterval, target: self, selector: #selector(Virgil_PagedView.loop), userInfo: nil, repeats: true)
  169. RunLoop.current.add(timer, forMode: RunLoop.Mode.default)
  170. addBottomView()
  171. }
  172. func addBottomView() {
  173. let view = UIView(frame: CGRect(x: 0, y: self.frame.size.height - 20, width: self.frame.size.width, height: 20))
  174. // view.backgroundColor = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.4)
  175. //
  176. self.addSubview(view)
  177. //
  178. pageControl.frame = CGRect(x: (view.frame.size.width - CGFloat(imageViewCount * 20)) / 2, y: 0, width: CGFloat(imageViewCount * 20), height: 20)
  179. pageControl.numberOfPages = imageViewCount
  180. pageControl.currentPage = 0
  181. pageControl.currentPageIndicatorTintColor = CommonUntils.getUIColorFromRGB(rgbValue: 0xffffff, alpha: 1.0)
  182. pageControl.pageIndicatorTintColor = CommonUntils.getUIColorFromRGB(rgbValue: 0xffffff, alpha: 0.6)
  183. view.addSubview(pageControl)
  184. }
  185. // MARK: 计时器方法
  186. @objc func loop() {
  187. let width = scrollView.frame.size.width
  188. let page = floor((scrollView.contentOffset.x - width/2)/width) + 1
  189. self.pageControl.currentPage = NSInteger(page)
  190. scrollView.setContentOffset(CGPoint(x: width * CGFloat(page + 1), y: 0), animated: true)
  191. }
  192. // MARK: - scrollView Delegate
  193. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  194. if (Int(scrollView.contentOffset.x) % Int(scrollView.frame.size.width)) == 0 {
  195. let width = scrollView.frame.size.width
  196. let page = floor((scrollView.contentOffset.x - width/2)/width) + 1
  197. if page == 0 {
  198. scrollView.setContentOffset(CGPoint(x: width * CGFloat(imageViewCount), y: 0), animated: false)
  199. self.pageControl.currentPage = imageViewCount - 1
  200. titleLabel?.text = titles[imageViewCount - 1] as? String
  201. } else if page >= CGFloat(imageViewCount + 1) {
  202. scrollView.setContentOffset(CGPoint(x: width, y: 0), animated: false)
  203. self.pageControl.currentPage = NSInteger(0)
  204. titleLabel?.text = titles[0] as? String
  205. } else {
  206. self.pageControl.currentPage = NSInteger(page - 1)
  207. titleLabel?.text = titles[Int(page - 1)] as? String
  208. }
  209. }
  210. }
  211. // MARK: btn点击
  212. @objc internal func btnClick(btn: AnyObject) {
  213. if btn.tag == 0 {
  214. //第一按钮对应最后一个
  215. if delegate != nil {
  216. delegate?.didTapItem?(item: imageViewCount - 1)
  217. }
  218. if tapItemClosure != nil {
  219. tapItemClosure!(imageViewCount - 1)
  220. }
  221. } else if btn.tag == imageViewCount + 1 {
  222. //最后一个按钮对应第一个
  223. if delegate != nil {
  224. delegate?.didTapItem?(item: 0)
  225. }
  226. if tapItemClosure != nil {
  227. tapItemClosure!(0)
  228. }
  229. } else {
  230. //正常对应 tag - 1 == i
  231. if delegate != nil {
  232. delegate?.didTapItem?(item: btn.tag - 1)
  233. }
  234. if tapItemClosure != nil {
  235. tapItemClosure!(btn.tag - 1)
  236. }
  237. }
  238. }
  239. }
  240. @objc
  241. public protocol Virgil_PagedViewDelegate {
  242. @objc optional func didTapItem(item: Int)
  243. }