Refreshable.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 nil
  39. }
  40. }
  41. extension Refreshable where Self : UIScrollView {
  42. @discardableResult
  43. func setupRefreshHeader(_ headerRefrehType:PullRefreshType = .tv,_ refreshHandler: @escaping () -> Void) -> ESRefreshHeaderView? {
  44. // switch headerRefrehType {
  45. // case .tv:
  46. // return self.es.addPullToRefresh(animator: TVHeaderAnimator(), handler: refreshHandler)
  47. // case .dance:
  48. // return self.es.addPullToRefresh(animator: DanceHeaderAnimator(), handler: refreshHandler)
  49. // case .rabbit:
  50. // return self.es.addPullToRefresh(animator: RabbitHeaderAnimator(), handler: refreshHandler)
  51. // default: return nil
  52. // }
  53. return nil
  54. }
  55. }
  56. protocol OutputRefreshProtocol {
  57. var refreshStatus: BehaviorRelay<BilibiliRefreshStatus>{get}
  58. }
  59. extension OutputRefreshProtocol {
  60. func autoSetRefreshStatus(header: ESRefreshHeaderView? = nil,footer: ESRefreshFooterView? = nil) -> Disposable {
  61. return refreshStatus.subscribe(onNext: { (status) in
  62. switch status {
  63. case .beginHeaderRefresh:
  64. header?.startRefreshing()
  65. case .endHeaderRefresh:
  66. header?.stopRefreshing()
  67. case .beginFooterRefresh:
  68. footer?.startRefreshing()
  69. case .endFooterRefresh:
  70. footer?.stopRefreshing()
  71. case .noMoreData:
  72. footer?.resetNoMoreData()
  73. default:break
  74. }
  75. })
  76. }
  77. }