JXSegmentedTitleImageDataSource.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //
  2. // JXSegmentedTitleImageDataSource.swift
  3. // JXSegmentedView
  4. //
  5. // Created by jiaxin on 2018/12/29.
  6. // Copyright © 2018 jiaxin. All rights reserved.
  7. //
  8. import UIKit
  9. public enum JXSegmentedTitleImageType {
  10. case topImage
  11. case leftImage
  12. case bottomImage
  13. case rightImage
  14. case onlyImage
  15. case onlyTitle
  16. case backgroundImage
  17. }
  18. public typealias LoadImageClosure = ((UIImageView, String) -> Void)
  19. open class JXSegmentedTitleImageDataSource: JXSegmentedTitleDataSource {
  20. open var titleImageType: JXSegmentedTitleImageType = .rightImage
  21. /// 数量需要和item的数量保持一致。可以是ImageName或者图片网络地址
  22. open var normalImageInfos: [String]?
  23. /// 数量需要和item的数量保持一致。可以是ImageName或者图片网络地址。如果不赋值,选中时就不会处理图片切换。
  24. open var selectedImageInfos: [String]?
  25. /// 内部默认通过UIImage(named:)加载图片。如果传递的是图片网络地址或者想自己处理图片加载逻辑,可以通过该闭包处理。
  26. open var loadImageClosure: LoadImageClosure?
  27. /// 图片尺寸
  28. open var imageSize: CGSize = CGSize(width: 20, height: 20)
  29. /// title和image之间的间隔
  30. open var titleImageSpacing: CGFloat = 5
  31. /// 是否开启图片缩放
  32. open var isImageZoomEnabled: Bool = false
  33. /// 图片缩放选中时的scale
  34. open var imageSelectedZoomScale: CGFloat = 1.2
  35. open override func preferredItemModelInstance() -> JXSegmentedBaseItemModel {
  36. return JXSegmentedTitleImageItemModel()
  37. }
  38. open override func preferredRefreshItemModel(_ itemModel: JXSegmentedBaseItemModel, at index: Int, selectedIndex: Int) {
  39. super.preferredRefreshItemModel(itemModel, at: index, selectedIndex: selectedIndex)
  40. guard let itemModel = itemModel as? JXSegmentedTitleImageItemModel else {
  41. return
  42. }
  43. itemModel.titleImageType = titleImageType
  44. itemModel.normalImageInfo = normalImageInfos?[index]
  45. itemModel.selectedImageInfo = selectedImageInfos?[index]
  46. itemModel.loadImageClosure = loadImageClosure
  47. itemModel.imageSize = imageSize
  48. itemModel.isImageZoomEnabled = isImageZoomEnabled
  49. itemModel.imageNormalZoomScale = 1
  50. itemModel.imageSelectedZoomScale = imageSelectedZoomScale
  51. itemModel.titleImageSpacing = titleImageSpacing
  52. if index == selectedIndex {
  53. itemModel.imageCurrentZoomScale = itemModel.imageSelectedZoomScale
  54. }else {
  55. itemModel.imageCurrentZoomScale = itemModel.imageNormalZoomScale
  56. }
  57. }
  58. open override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat {
  59. var width = super.preferredSegmentedView(segmentedView, widthForItemAt: index)
  60. if itemWidth == JXSegmentedViewAutomaticDimension {
  61. switch titleImageType {
  62. case .leftImage, .rightImage:
  63. width += titleImageSpacing + imageSize.width
  64. case .topImage, .bottomImage:
  65. width = max(width, imageSize.width)
  66. case .onlyImage:
  67. width = imageSize.width
  68. case .onlyTitle:
  69. break
  70. case .backgroundImage:
  71. width = max(width, imageSize.width)
  72. }
  73. }
  74. return width
  75. }
  76. public override func segmentedView(_ segmentedView: JXSegmentedView, widthForItemContentAt index: Int) -> CGFloat {
  77. var width = super.segmentedView(segmentedView, widthForItemContentAt: index)
  78. switch titleImageType {
  79. case .leftImage, .rightImage:
  80. width += titleImageSpacing + imageSize.width
  81. case .topImage, .bottomImage:
  82. width = max(width, imageSize.width)
  83. case .onlyImage:
  84. width = imageSize.width
  85. case .onlyTitle:
  86. break
  87. case .backgroundImage:
  88. width = max(width, imageSize.width)
  89. }
  90. return width
  91. }
  92. //MARK: - JXSegmentedViewDataSource
  93. open override func registerCellClass(in segmentedView: JXSegmentedView) {
  94. segmentedView.collectionView.register(JXSegmentedTitleImageCell.self, forCellWithReuseIdentifier: "cell")
  95. }
  96. open override func segmentedView(_ segmentedView: JXSegmentedView, cellForItemAt index: Int) -> JXSegmentedBaseCell {
  97. let cell = segmentedView.dequeueReusableCell(withReuseIdentifier: "cell", at: index)
  98. return cell
  99. }
  100. open override func refreshItemModel(_ segmentedView: JXSegmentedView, leftItemModel: JXSegmentedBaseItemModel, rightItemModel: JXSegmentedBaseItemModel, percent: CGFloat) {
  101. super.refreshItemModel(segmentedView, leftItemModel: leftItemModel, rightItemModel: rightItemModel, percent: percent)
  102. guard let leftModel = leftItemModel as? JXSegmentedTitleImageItemModel, let rightModel = rightItemModel as? JXSegmentedTitleImageItemModel else {
  103. return
  104. }
  105. if isImageZoomEnabled && isItemTransitionEnabled {
  106. leftModel.imageCurrentZoomScale = JXSegmentedViewTool.interpolate(from: imageSelectedZoomScale, to: 1, percent: CGFloat(percent))
  107. rightModel.imageCurrentZoomScale = JXSegmentedViewTool.interpolate(from: 1, to: imageSelectedZoomScale, percent: CGFloat(percent))
  108. }
  109. }
  110. open override func refreshItemModel(_ segmentedView: JXSegmentedView, currentSelectedItemModel: JXSegmentedBaseItemModel, willSelectedItemModel: JXSegmentedBaseItemModel, selectedType: JXSegmentedViewItemSelectedType) {
  111. super.refreshItemModel(segmentedView, currentSelectedItemModel: currentSelectedItemModel, willSelectedItemModel: willSelectedItemModel, selectedType: selectedType)
  112. guard let myCurrentSelectedItemModel = currentSelectedItemModel as? JXSegmentedTitleImageItemModel, let myWillSelectedItemModel = willSelectedItemModel as? JXSegmentedTitleImageItemModel else {
  113. return
  114. }
  115. myCurrentSelectedItemModel.imageCurrentZoomScale = myCurrentSelectedItemModel.imageNormalZoomScale
  116. myWillSelectedItemModel.imageCurrentZoomScale = myWillSelectedItemModel.imageSelectedZoomScale
  117. }
  118. }