UICollectionView+Ex.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //
  2. // UICollectionView+Ex.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2024/12/20.
  6. //
  7. import UIKit
  8. import MJRefresh
  9. private var isMJRefreshKey = "isMJRefreshKey"
  10. private var pageNumKey = "pageNumKey"
  11. private var pageSizeKey = "pageSizeKey"
  12. private var dataArrayKey = "dataArrayKey"
  13. private let PAGESIZE = 10
  14. private let PAGENUM = 1
  15. extension UICollectionView {
  16. static func createCommon(delegate: UICollectionViewDelegate & UICollectionViewDataSource, cellReuseIds: [String]) -> UICollectionView {
  17. let layout = UICollectionViewFlowLayout()
  18. layout.scrollDirection = .vertical
  19. let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: layout)
  20. collectionView.delegate = delegate
  21. collectionView.dataSource = delegate
  22. collectionView.showsVerticalScrollIndicator = false
  23. collectionView.showsHorizontalScrollIndicator = false
  24. collectionView.backgroundColor = .clear
  25. if #available(iOS 11.0, *) {
  26. collectionView.contentInsetAdjustmentBehavior = .never
  27. }
  28. for cellReuseId in cellReuseIds {
  29. collectionView.register(cellReuseId.toClass(), forCellWithReuseIdentifier: cellReuseId)
  30. }
  31. collectionView.dataArray = []
  32. collectionView.pageNum = PAGENUM
  33. collectionView.pageSize = PAGESIZE
  34. return collectionView
  35. }
  36. func myReloadData() {
  37. reloadData()
  38. }
  39. func addFooterWithRefreshingBlock(_ block: @escaping () -> Void) {
  40. isUseMJRefresh = true
  41. mj_footer = MJRefreshAutoNormalFooter(refreshingBlock: { [weak self] in
  42. self?.pageNum += 1
  43. block()
  44. })
  45. (mj_footer as? MJRefreshAutoNormalFooter)?.stateLabel?.isHidden = true
  46. }
  47. func addHeaderWithRefreshingBlock(_ block: @escaping () -> Void) {
  48. isUseMJRefresh = true
  49. mj_header = MJRefreshNormalHeader(refreshingBlock: { [weak self] in
  50. self?.pageNum = PAGENUM
  51. block()
  52. })
  53. }
  54. func handleDataArray(_ networkArray: [Any], noMore: Bool) {
  55. let count = networkArray.count
  56. if count > 0 {
  57. if pageNum <= PAGENUM {
  58. dataArray.removeAll()
  59. }
  60. dataArray.append(contentsOf: networkArray)
  61. myReloadData()
  62. } else if pageNum <= PAGENUM {
  63. dataArray.removeAll()
  64. myReloadData()
  65. }
  66. if isUseMJRefresh {
  67. if !noMore {
  68. mj_footer?.resetNoMoreData()
  69. } else {
  70. mj_footer?.endRefreshingWithNoMoreData()
  71. }
  72. if pageNum <= PAGENUM {
  73. mj_header?.endRefreshing()
  74. }
  75. }
  76. }
  77. func handleDataArray(_ networkArray: [Any]) {
  78. handleDataArray(networkArray, noMore: networkArray.count < pageSize)
  79. }
  80. func handleMJRefreshWithCount(_ count: Int) {
  81. if count >= pageSize {
  82. mj_footer?.resetNoMoreData()
  83. } else {
  84. mj_footer?.endRefreshingWithNoMoreData()
  85. }
  86. if pageNum <= PAGENUM {
  87. mj_header?.endRefreshing()
  88. }
  89. }
  90. func handleMJRefreshWithError(_ error: String) {
  91. if pageNum <= PAGENUM {
  92. mj_header?.endRefreshing()
  93. } else {
  94. mj_footer?.endRefreshing()
  95. }
  96. }
  97. // MARK: - Properties
  98. var isUseMJRefresh: Bool {
  99. get { (objc_getAssociatedObject(self, &isMJRefreshKey) as? Bool) ?? false }
  100. set { objc_setAssociatedObject(self, &isMJRefreshKey, newValue, .OBJC_ASSOCIATION_ASSIGN) }
  101. }
  102. var pageNum: Int {
  103. get { (objc_getAssociatedObject(self, &pageNumKey) as? Int) ?? PAGENUM }
  104. set { objc_setAssociatedObject(self, &pageNumKey, newValue, .OBJC_ASSOCIATION_ASSIGN) }
  105. }
  106. var pageSize: Int {
  107. get { (objc_getAssociatedObject(self, &pageSizeKey) as? Int) ?? PAGESIZE }
  108. set { objc_setAssociatedObject(self, &pageSizeKey, newValue, .OBJC_ASSOCIATION_ASSIGN) }
  109. }
  110. var dataArray: [Any] {
  111. get { (objc_getAssociatedObject(self, &dataArrayKey) as? [Any]) ?? [] }
  112. set { objc_setAssociatedObject(self, &dataArrayKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
  113. }
  114. }