Refreshable.swift 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // Refreshable.swift
  3. // SwiftBilibili
  4. //
  5. // Created by 罗文 on 2021/2/24.
  6. // Copyright © 2021年 罗文. All rights reserved.
  7. //
  8. import RxSwift
  9. import ESPullToRefresh
  10. import RxCocoa
  11. enum PullRefreshType {
  12. case dance
  13. case rabbit
  14. case tv
  15. case none
  16. }
  17. enum BilibiliRefreshStatus {
  18. case none
  19. case beginHeaderRefresh
  20. case endHeaderRefresh
  21. case beginFooterRefresh
  22. case endFooterRefresh
  23. case noMoreData
  24. }
  25. protocol Refreshable {}
  26. extension Refreshable where Self : UIViewController {
  27. @discardableResult
  28. func setupRefreshHeader(_ scrollView: UIScrollView,_ headerRefrehType:PullRefreshType = .tv,_ refreshHandler: @escaping () -> Void) -> ESRefreshHeaderView? {
  29. // switch headerRefrehType {
  30. // case .tv:
  31. // return scrollView.es.addPullToRefresh(animator: TVHeaderAnimator(), handler: refreshHandler)
  32. // case .dance:
  33. // return scrollView.es.addPullToRefresh(animator: DanceHeaderAnimator(), handler: refreshHandler)
  34. // case .rabbit:
  35. // return scrollView.es.addPullToRefresh(animator: RabbitHeaderAnimator(), handler: refreshHandler)
  36. // default: return nil
  37. // }
  38. return scrollView.es.addPullToRefresh(animator: TVHeaderAnimator(), handler: refreshHandler)
  39. return nil
  40. }
  41. }
  42. extension Refreshable where Self : UIScrollView {
  43. @discardableResult
  44. func setupRefreshHeader(_ headerRefrehType:PullRefreshType = .tv,_ refreshHandler: @escaping () -> Void) -> ESRefreshHeaderView? {
  45. // switch headerRefrehType {
  46. // case .tv:
  47. // return self.es.addPullToRefresh(animator: TVHeaderAnimator(), handler: refreshHandler)
  48. // case .dance:
  49. // return self.es.addPullToRefresh(animator: DanceHeaderAnimator(), handler: refreshHandler)
  50. // case .rabbit:
  51. // return self.es.addPullToRefresh(animator: RabbitHeaderAnimator(), handler: refreshHandler)
  52. // default: return nil
  53. // }
  54. return self.es.addPullToRefresh(animator: TVHeaderAnimator(), handler: refreshHandler)
  55. return nil
  56. }
  57. }
  58. protocol OutputRefreshProtocol {
  59. var refreshStatus: BehaviorRelay<BilibiliRefreshStatus>{get}
  60. }
  61. extension OutputRefreshProtocol {
  62. func autoSetRefreshStatus(header: ESRefreshHeaderView? = nil,footer: ESRefreshFooterView? = nil) -> Disposable {
  63. return refreshStatus.subscribe(onNext: { (status) in
  64. switch status {
  65. case .beginHeaderRefresh:
  66. header?.startRefreshing()
  67. case .endHeaderRefresh:
  68. header?.stopRefreshing()
  69. case .beginFooterRefresh:
  70. footer?.startRefreshing()
  71. case .endFooterRefresh:
  72. footer?.stopRefreshing()
  73. case .noMoreData:
  74. footer?.resetNoMoreData()
  75. default:break
  76. }
  77. })
  78. }
  79. }