text: //
  //  CGXPagerListView.h
  //  CGXPagerListView
  //
  //  Created by CGX on 2018/8/27.
  //  Copyright © 2018年 CGX. All rights reserved.
  //
  /*
  
  下载链接：https://github.com/974794055/CGXPageListView-OC.git
  QQ号：974794055
  版本： 0.0.2
  */
  
  
  #import <UIKit/UIKit.h>
  #import "CGXPagerListMainTableView.h"
  #import "CGXPagerListContainerView.h"
  
  @class CGXPagerListView;
  
  /**
   该协议主要用于mainTableView已经显示了header，listView的contentOffset需要重置时，内部需要访问到外部传入进来的listView内的scrollView
   */
  @protocol CGXPagerListViewListViewDelegate <NSObject>
  
  /**
   返回listView。如果是vc包裹的就是vc.view；如果是自定义view包裹的，就是自定义view自己。
  
   @return UIView
   */
  - (UIView *)listView;
  
  /**
   返回listView内部持有的UIScrollView或UITableView或UICollectionView
   主要用于mainTableView已经显示了header，listView的contentOffset需要重置时，内部需要访问到外部传入进来的listView内的scrollView
  
   @return listView内部持有的UIScrollView或UITableView或UICollectionView
   */
  - (UIScrollView *)listScrollView;
  
  
  /**
   当listView内部持有的UIScrollView或UITableView或UICollectionView的代理方法`scrollViewDidScroll`回调时，需要调用该代理方法传入的callback
  
   @param callback `scrollViewDidScroll`回调时调用的callback
   */
  - (void)listViewDidScrollCallback:(void (^)(UIScrollView *scrollView))callback;
  
  @optional
  
  /**
   将要重置listScrollView的contentOffset
   */
  - (void)listScrollViewWillResetContentOffset;
  
  /**
   可选实现，列表显示的时候调用
   */
  - (void)listDidAppear;
  
  /**
   可选实现，列表消失的时候调用
   */
  - (void)listDidDisappear;
  
  @end
  
  @protocol CGXPagerListViewDelegate <NSObject>
  
  /*
   返回tableHeaderView的高度，因为内部需要比对判断，只能是整型数
   @param pagerView pagerView description
   @return return tableHeaderView的高度
   */
  - (NSUInteger)listTableHeaderViewHeightInPagerView:(CGXPagerListView *)pagerView;
  
  /*
   返回tableHeaderView
   @param pagerView pagerView description
   @return tableHeaderView
   */
  - (UIView *)listTableHeaderViewInPagerView:(CGXPagerListView *)pagerView;
  
  /*
   返回悬浮HeaderView的高度，因为内部需要比对判断，只能是整型数
  
   @param pagerView pagerView description
   @return 悬浮HeaderView的高度
   */
  - (NSUInteger)listHeightForPinSectionHeaderInPagerView:(CGXPagerListView *)pagerView;
  
  
  /*
   返回悬浮HeaderView。
   @param pagerView pagerView description
   @return 悬浮HeaderView
   */
  - (UIView *)listViewForPinSectionHeaderInPagerView:(CGXPagerListView *)pagerView;
  
  /*
   返回列表的数量
  
   @param pagerView pagerView description
   @return 列表的数量
   */
  - (NSInteger)listNumberOfListsInPagerView:(CGXPagerListView *)pagerView;
  
  /*
   根据index初始化一个对应列表实例，需要是遵从`CGXPagerListViewListViewDelegate`协议的对象。
   如果列表是用自定义UIView封装的，就让自定义UIView遵从`CGXPagerListViewListViewDelegate`协议，该方法返回自定义UIView即可。
   如果列表是用自定义UIViewController封装的，就让自定义UIViewController遵从`CGXPagerListViewListViewDelegate`协议，该方法返回自定义UIViewController即可。
   注意：一定要是新生成的实例！！！
  
   @param pagerView pagerView description
   @param index index description
   @return 新生成的列表实例
   */
  - (id<CGXPagerListViewListViewDelegate>)listPagerView:(CGXPagerListView *)pagerView initListAtIndex:(NSInteger)index;
  
  @optional
  
  /*
   返回悬浮FooterView的高度，因为内部需要比对判断，只能是整型数
  
   @param pagerView pagerView description
   @return 悬浮HeaderView的高度
   */
  - (NSUInteger)listHeightForPinSectionFooterInPagerView:(CGXPagerListView *)pagerView;
  
  
  /*
   返回悬浮FooterView。
   @param pagerView pagerView description
   @return 悬浮HeaderView
   */
  - (UIView *)listViewForPinSectionFooterInPagerView:(CGXPagerListView *)pagerView;
  
  /*
   mainTableView的滚动回调，用于实现头图跟随缩放
  
   @param scrollView mainTableView
   */
  - (void)listMainTableViewDidScroll:(UIScrollView *)scrollView;
  
  @end
  
  @interface CGXPagerListView : UIView
  
  @property (nonatomic, weak) id<CGXPagerListViewDelegate> delegate;
  
  /* 列表主滚动视图  */
  @property (nonatomic, strong, readonly) CGXPagerListMainTableView *mainTableView;
  
  /* 列表子滚动视图  */
  @property (nonatomic, strong, readonly) CGXPagerListContainerView *listContainerView;
  
  /* 初始化滚动列表  */
  - (instancetype)initWithDelegate:(id<CGXPagerListViewDelegate>)delegate NS_DESIGNATED_INITIALIZER;
  /* 是否允许列表左右滑动。默认：YES */
  @property (nonatomic, assign) BOOL isListHorizontalScrollEnabled;
  
  - (instancetype)init NS_UNAVAILABLE;
  
  - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
  
  - (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
  
  /* 初始化配置  */
  - (void)initializeViews NS_REQUIRES_SUPER;
  
  /* 加载刷新数据源  */
  - (void)reloadData;
  
  //可选调用：如果你的子列表在整个页面消失的时候(比如push到新的页面)，做一些暂停操作。比如列表有视频正在播放，离开的时候要暂停，就必须要调用该方法。使用示例在`PagingViewController`类。
  - (void)currentListDidDisappear;
  //可选调用：如果你的子列表在整个页面重新出现的时候(比如pop回来)，做一些恢复操作。比如继续播放之前的视频。就必须要调用该方法。使用示例在`PagingViewController`类。
  - (void)currentListDidAppear;
  
  /*
   **************** 暴露给子类使用，请勿直接使用该属性！**************
   */
  @property (nonatomic, strong, readonly) UIScrollView *currentScrollingListView;
  @property (nonatomic, strong, readonly) id<CGXPagerListViewListViewDelegate> currentList;
  @property (nonatomic, strong, readonly) NSDictionary <NSNumber *, id<CGXPagerListViewListViewDelegate>> *validListDict;   //当前已经加载过可用的列表字典，key就是index值，value是对应的列表。
  - (void)preferredProcessListViewDidScroll:(UIScrollView *)scrollView NS_REQUIRES_SUPER;
  - (void)preferredProcessMainTableViewDidScroll:(UIScrollView *)scrollView NS_REQUIRES_SUPER;
  
  @end
  
  
  