JXPagerListContainerView.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // JXCategoryListScrollView.h
  3. // JXCategoryView
  4. //
  5. // Created by jiaxin on 2018/9/12.
  6. // Copyright © 2018年 jiaxin. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. @class JXPagerListContainerView;
  10. @class JXPagerListContainerScrollView;
  11. @protocol JXPagerViewListViewDelegate <NSObject>
  12. /**
  13. 返回listView。如果是vc包裹的就是vc.view;如果是自定义view包裹的,就是自定义view自己。
  14. @return UIView
  15. */
  16. - (UIView *)listView;
  17. /**
  18. 返回listView内部持有的UIScrollView或UITableView或UICollectionView
  19. 主要用于mainTableView已经显示了header,listView的contentOffset需要重置时,内部需要访问到外部传入进来的listView内的scrollView
  20. @return listView内部持有的UIScrollView或UITableView或UICollectionView
  21. */
  22. - (UIScrollView *)listScrollView;
  23. /**
  24. 当listView内部持有的UIScrollView或UITableView或UICollectionView的代理方法`scrollViewDidScroll`回调时,需要调用该代理方法传入的callback
  25. @param callback `scrollViewDidScroll`回调时调用的callback
  26. */
  27. - (void)listViewDidScrollCallback:(void (^)(UIScrollView *scrollView))callback;
  28. @optional
  29. - (void)listScrollViewWillResetContentOffset;
  30. - (void)listWillAppear;
  31. - (void)listDidAppear;
  32. - (void)listWillDisappear;
  33. - (void)listDidDisappear;
  34. @end
  35. /**
  36. 列表容器视图的类型
  37. - ScrollView: UIScrollView。优势:没有其他副作用。劣势:实时的视图内存占用相对大一点,因为所有加载之后的列表视图都在视图层级里面。
  38. - CollectionView: 使用UICollectionView。优势:因为列表被添加到cell上,实时的视图内存占用更少,适合内存要求特别高的场景。劣势:因为cell重用机制的问题,导致列表被移除屏幕外之后,会被放入缓存区,而不存在于视图层级中。如果刚好你的列表使用了下拉刷新视图,在快速切换过程中,就会导致下拉刷新回调不成功的问题。一句话概括:使用CollectionView的时候,就不要让列表使用下拉刷新加载。
  39. */
  40. typedef NS_ENUM(NSUInteger, JXPagerListContainerType) {
  41. JXPagerListContainerType_ScrollView,
  42. JXPagerListContainerType_CollectionView,
  43. };
  44. @protocol JXPagerListContainerViewDelegate <NSObject>
  45. /**
  46. 返回list的数量
  47. @param listContainerView 列表的容器视图
  48. @return list的数量
  49. */
  50. - (NSInteger)numberOfListsInlistContainerView:(JXPagerListContainerView *)listContainerView;
  51. /**
  52. 根据index返回一个对应列表实例,需要是遵从`JXPagerViewListViewDelegate`协议的对象。
  53. 你可以代理方法调用的时候初始化对应列表,达到懒加载的效果。这也是默认推荐的初始化列表方法。你也可以提前创建好列表,等该代理方法回调的时候再返回也可以,达到预加载的效果。
  54. 如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIView即可。
  55. 如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIViewController即可。
  56. @param listContainerView 列表的容器视图
  57. @param index 目标下标
  58. @return 遵从JXPagerViewListViewDelegate协议的list实例
  59. */
  60. - (id<JXPagerViewListViewDelegate>)listContainerView:(JXPagerListContainerView *)listContainerView initListForIndex:(NSInteger)index;
  61. @optional
  62. /**
  63. 返回自定义UIScrollView或UICollectionView的Class
  64. 某些特殊情况需要自己处理UIScrollView内部逻辑。比如项目用了FDFullscreenPopGesture,需要处理手势相关代理。
  65. @param listContainerView JXPagerListContainerView
  66. @return 自定义UIScrollView实例
  67. */
  68. - (Class)scrollViewClassInlistContainerView:(JXPagerListContainerView *)listContainerView;
  69. /**
  70. 控制能否初始化对应index的列表。有些业务需求,需要在某些情况才允许初始化某些列表,通过通过该代理实现控制。
  71. */
  72. - (BOOL)listContainerView:(JXPagerListContainerView *)listContainerView canInitListAtIndex:(NSInteger)index;
  73. - (void)listContainerViewDidScroll:(UIScrollView *)scrollView;
  74. - (void)listContainerViewWillBeginDragging:(JXPagerListContainerView *)listContainerView;
  75. - (void)listContainerViewWDidEndScroll:(JXPagerListContainerView *)listContainerView;
  76. - (void)listContainerView:(JXPagerListContainerView *)listContainerView listDidAppearAtIndex:(NSInteger)index;
  77. @end
  78. @interface JXPagerListContainerView : UIView
  79. @property (nonatomic, assign, readonly) JXPagerListContainerType containerType;
  80. @property (nonatomic, strong, readonly) UIScrollView *scrollView;
  81. @property (nonatomic, strong, readonly) NSDictionary <NSNumber *, id<JXPagerViewListViewDelegate>> *validListDict; //已经加载过的列表字典。key是index,value是对应的列表
  82. @property (nonatomic, strong) UIColor *listCellBackgroundColor; //默认:[UIColor whiteColor]
  83. /**
  84. 滚动切换的时候,滚动距离超过一页的多少百分比,就触发列表的初始化。默认0.01(即列表显示了一点就触发加载)。范围0~1,开区间不包括0和1
  85. */
  86. @property (nonatomic, assign) CGFloat initListPercent;
  87. ///当使用Category嵌套Paging的时候,需要设置为YES,默认为NO;
  88. @property (nonatomic, assign, getter=isCategoryNestPagingEnabled) BOOL categoryNestPagingEnabled;
  89. - (instancetype)init NS_UNAVAILABLE;
  90. - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
  91. - (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
  92. - (instancetype)initWithType:(JXPagerListContainerType)type delegate:(id<JXPagerListContainerViewDelegate>)delegate NS_DESIGNATED_INITIALIZER;
  93. @end
  94. @interface JXPagerListContainerView (ListContainer)
  95. - (void)setDefaultSelectedIndex:(NSInteger)index;
  96. - (UIScrollView *)contentScrollView;
  97. - (void)reloadData;
  98. - (void)scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio selectedIndex:(NSInteger)selectedIndex;
  99. - (void)didClickSelectedItemAtIndex:(NSInteger)index;
  100. @end