CGXVerticalMenuMoreView.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. //
  2. // CGXVerticalMenuMoreView.m
  3. // CGXVerticalMenuView-OC
  4. //
  5. // Created by CGX on 2018/05/01.
  6. // Copyright © 2019 CGX. All rights reserved.
  7. //
  8. #import "CGXVerticalMenuMoreView.h"
  9. #import "CGXVerticalMenuListContainerView.h"
  10. #import "CGXVerticalMenuTitleView.h"
  11. @interface CGXVerticalMenuMoreView ()<CGXVerticalMenuTitleViewDelegate,CGXVerticalMenuListContainerViewDataSource,CGXVerticalMenuMoreListViewDelegate>
  12. @property (nonatomic , strong) CGXVerticalMenuTitleView *leftView;
  13. @property (nonatomic , assign,readwrite) NSInteger currentInteger;
  14. @property (nonatomic, strong) CGXVerticalMenuListContainerView *listContainerView;
  15. @property (nonatomic , strong,readwrite) NSMutableArray <CGXVerticalMenuMoreListModel *> *dataArray;
  16. @end
  17. @implementation CGXVerticalMenuMoreView
  18. - (void)initializeData
  19. {
  20. [super initializeData];
  21. self.leftBgColor = [UIColor colorWithWhite:0.93 alpha:1];;
  22. self.rightBgColor = [UIColor whiteColor];
  23. self.titleWidth = 100;
  24. self.currentInteger = 0;
  25. }
  26. - (void)initializeViews
  27. {
  28. [super initializeViews];
  29. self.leftView = [[CGXVerticalMenuTitleView alloc] initWithFrame:CGRectMake(0, 0, self.titleWidth, CGRectGetHeight(self.bounds))];
  30. self.leftView.delegate = self;
  31. self.leftView.backgroundColor = self.leftBgColor;
  32. [self addSubview:self.leftView];
  33. CGXVerticalMenuIndicatorBackgroundView *backgroundView = [[CGXVerticalMenuIndicatorBackgroundView alloc] init];
  34. backgroundView.backgroundViewColor = [UIColor whiteColor];
  35. backgroundView.backgroundViewCornerRadius = 0;
  36. CGXVerticalMenuIndicatorLineView *lineView = [[CGXVerticalMenuIndicatorLineView alloc] init];
  37. lineView.backgroundColor = [UIColor redColor];
  38. lineView.positionType = CGXVerticalMenuIndicatorLinePosition_Left;
  39. self.leftView.indicators = @[lineView,backgroundView];
  40. self.listContainerView = [[CGXVerticalMenuListContainerView alloc] initWithDelegate:self];
  41. self.listContainerView.backgroundColor = self.rightBgColor;
  42. self.listContainerView.isHorizontal = NO;
  43. self.listContainerView.collectionView.scrollEnabled = NO;
  44. [self addSubview:self.listContainerView];
  45. }
  46. - (void)layoutSubviews
  47. {
  48. [super layoutSubviews];
  49. self.leftView.frame = CGRectMake(0, 0, self.titleWidth, CGRectGetHeight(self.frame));
  50. self.listContainerView.frame = CGRectMake(self.titleWidth, 0, CGRectGetWidth(self.frame)-self.titleWidth, CGRectGetHeight(self.frame));;
  51. [self reloadData];
  52. }
  53. - (NSMutableArray<CGXVerticalMenuMoreListModel *> *)dataArray
  54. {
  55. if (!_dataArray) {
  56. _dataArray = [NSMutableArray array];
  57. }
  58. return _dataArray;
  59. }
  60. - (void)setLeftBgColor:(UIColor *)leftBgColor
  61. {
  62. _leftBgColor = leftBgColor;
  63. self.leftView.backgroundColor = leftBgColor;
  64. }
  65. - (void)setRightBgColor:(UIColor *)rightBgColor
  66. {
  67. _rightBgColor = rightBgColor;
  68. self.listContainerView.backgroundColor = rightBgColor;
  69. }
  70. - (void)verticalMenuTitleView:(CGXVerticalMenuTitleView *)categoryView didClickSelectedItemAtIndex:(NSInteger)index
  71. {
  72. self.currentInteger = index;
  73. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:didSelectedItemAtIndex:)]) {
  74. [self.delegate verticalMenuMoreView:self didSelectedItemAtIndex:index];
  75. }
  76. [self.listContainerView scrollSelectedItemAtIndex:index];
  77. }
  78. - (void)verticalMenuTitleView:(CGXVerticalMenuTitleView *)categoryView didScrollerSelectedItemAtIndex:(NSInteger)index
  79. {
  80. self.currentInteger = index;
  81. }
  82. - (void)verticalMenuTitleView:(CGXVerticalMenuTitleView *)categoryView didSelectedItemAtIndex:(NSInteger)index
  83. {
  84. self.currentInteger = index;
  85. }
  86. - (NSInteger)numberOfListsInlistContainerView:(CGXVerticalMenuListContainerView *)listContainerView
  87. {
  88. return self.dataArray.count;
  89. }
  90. - (id<CGXVerticalMenuListContainerViewDelegate>)listContainerView:(CGXVerticalMenuListContainerView *)listContainerView initListForIndex:(NSInteger)index
  91. {
  92. CGXVerticalMenuMoreListView *pageScrollView = [[CGXVerticalMenuMoreListView alloc] init];
  93. pageScrollView.backgroundColor = self.rightBgColor;
  94. pageScrollView.listDelegate = self;
  95. CGXVerticalMenuMoreListModel *listModel = self.dataArray[index];
  96. [pageScrollView updateWithListModel:listModel AtIndex:index];
  97. pageScrollView.menu_ImageCallback = ^(UIImageView * _Nonnull hotImageView, NSURL * _Nonnull hotImageURL) {
  98. if (listModel.menu_ImageCallback) {
  99. listModel.menu_ImageCallback(hotImageView, hotImageURL);
  100. };
  101. };
  102. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:RefreshScrollView:listViewInRow:)]) {
  103. [self.delegate verticalMenuMoreView:self RefreshScrollView:pageScrollView listViewInRow:index];
  104. }
  105. return pageScrollView;
  106. }
  107. /** 如果你需要自定义cell样式,请在实现此代理方法返回你的自定义cell的class。 */
  108. - (Class)verticalMenuMoreListViewCustomCollectionViewCellClass
  109. {
  110. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreViewCustomCollectionViewCellClass)] && [self.delegate verticalMenuMoreViewCustomCollectionViewCellClass]) {
  111. return [self.delegate verticalMenuMoreViewCustomCollectionViewCellClass];
  112. }
  113. return nil;
  114. }
  115. /** 如果你需要自定义cell样式,请在实现此代理方法返回你的自定义cell的Nib。 */
  116. - (Class)verticalMenuMoreListViewCustomCollectionViewCellNib
  117. {
  118. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreViewCustomCollectionViewCellNib)] && [self.delegate verticalMenuMoreViewCustomCollectionViewCellNib]) {
  119. return [self.delegate verticalMenuMoreViewCustomCollectionViewCellNib];
  120. }
  121. return nil;
  122. }
  123. /**
  124. 每个分区自定义cell
  125. */
  126. - (UICollectionViewCell *)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView CollectionView:(nonnull UICollectionView *)collectionView AtIndex:(NSInteger)index cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath
  127. {
  128. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:CollectionView:AtIndex:cellForItemAtIndexPath:)]) {
  129. return [self.delegate verticalMenuMoreView:self CollectionView:collectionView AtIndex:index cellForItemAtIndexPath:indexPath];
  130. }
  131. return nil;
  132. }
  133. - (UIView *)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView HeaderAtIndex:(NSInteger)index
  134. {
  135. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:HeadAtIndex:)]) {
  136. return [self.delegate verticalMenuMoreView:self HeadAtIndex:index];
  137. }
  138. return nil;
  139. }
  140. - (UIView *)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView FooterAtIndex:(NSInteger)index
  141. {
  142. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:FootAtIndex:)]) {
  143. return [self.delegate verticalMenuMoreView:self FootAtIndex:index];
  144. }
  145. return nil;
  146. }
  147. - (UIView *)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView AtIndex:(NSInteger)index KindHeadAtIndexPath:(NSIndexPath *)indexPath
  148. {
  149. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:AtIndex:KindHeadAtIndexPath:)]) {
  150. return [self.delegate verticalMenuMoreView:self AtIndex:index KindHeadAtIndexPath:indexPath];
  151. }
  152. return nil;
  153. }
  154. - (UIView *)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView AtIndex:(NSInteger)index KindFootAtIndexPath:(NSIndexPath *)indexPath
  155. {
  156. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:AtIndex:KindFootAtIndexPath:)]) {
  157. return [self.delegate verticalMenuMoreView:self AtIndex:index KindFootAtIndexPath:indexPath];
  158. }
  159. return nil;
  160. }
  161. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView AtIndex:(NSInteger)index didClickSelectedItemAtIndexPath:(NSIndexPath *)indexPath
  162. {
  163. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:AtIndex:didSelectedItemDetailsAtIndexPath:)]) {
  164. [self.delegate verticalMenuMoreView:self AtIndex:index didSelectedItemDetailsAtIndexPath:indexPath];
  165. }
  166. }
  167. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView
  168. scrollViewDidScroll:(UIScrollView *)scrollView
  169. {
  170. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:scrollViewDidScroll:listViewInRow:)]) {
  171. [self.delegate verticalMenuMoreView:self scrollViewDidScroll:listView listViewInRow:listView.selectedIndex];
  172. }
  173. }
  174. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
  175. {
  176. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:scrollViewDidEndDragging:willDecelerate:listViewInRow:)]) {
  177. [self.delegate verticalMenuMoreView:self scrollViewDidEndDragging:listView willDecelerate:decelerate listViewInRow:listView.selectedIndex];
  178. }
  179. }
  180. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView scrollViewWillBeginDragging:(UIScrollView *)scrollView
  181. {
  182. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:scrollViewWillBeginDragging:listViewInRow:)]) {
  183. [self.delegate verticalMenuMoreView:self scrollViewWillBeginDragging:listView listViewInRow:listView.selectedIndex];
  184. }
  185. }
  186. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  187. {
  188. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:scrollViewDidEndDecelerating:listViewInRow:)]) {
  189. [self.delegate verticalMenuMoreView:self scrollViewDidEndDecelerating:listView listViewInRow:listView.selectedIndex];
  190. }
  191. }
  192. - (void)verticalMenuMoreListView:(CGXVerticalMenuMoreListView *)listView scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
  193. {
  194. if (self.delegate && [self.delegate respondsToSelector:@selector(verticalMenuMoreView:scrollViewDidEndScrollingAnimation:listViewInRow:)]) {
  195. [self.delegate verticalMenuMoreView:self scrollViewDidEndScrollingAnimation:listView listViewInRow:listView.selectedIndex];
  196. }
  197. }
  198. /*
  199. 数据源
  200. */
  201. - (void)updateListWithDataArray:(NSMutableArray<CGXVerticalMenuMoreListModel *> *)dataArray
  202. {
  203. [self.dataArray removeAllObjects];
  204. [self.dataArray addObjectsFromArray:dataArray];
  205. NSMutableArray *dataArr = [NSMutableArray array];
  206. for (CGXVerticalMenuMoreListModel *listModel in self.dataArray) {
  207. CGXVerticalMenuTitleModel *itemModel = listModel.leftModel;
  208. [dataArr addObject:itemModel];
  209. }
  210. [self.leftView updateMenuWithDataArray:dataArr];
  211. [self.listContainerView reloadData];
  212. }
  213. /*
  214. 更新某个下标数据使用
  215. */
  216. - (void)updateListWistAtIndex:(NSInteger)index ItemModel:(CGXVerticalMenuMoreListModel *)itemModel
  217. {
  218. if (self.dataArray.count==0 || index<0) {
  219. return;
  220. }
  221. if (index>self.dataArray.count-1) {
  222. return;
  223. }
  224. [self.dataArray replaceObjectAtIndex:index withObject:itemModel];
  225. [self.listContainerView reloadData];
  226. }
  227. - (void)reloadData
  228. {
  229. [self.leftView.collectionView reloadData];
  230. [self.listContainerView reloadData];
  231. }
  232. /**
  233. 选中目标index的item
  234. @param index 目标index
  235. */
  236. - (void)selectItemAtIndex:(NSInteger)index
  237. {
  238. dispatch_async(dispatch_get_main_queue(), ^{
  239. if (self.dataArray.count==0 || index<0) {
  240. return;
  241. }
  242. if (index>self.dataArray.count-1) {
  243. return;
  244. }
  245. [self.leftView scrollerItemAtIndex:index];
  246. [self.listContainerView scrollSelectedItemAtIndex:index];
  247. });
  248. }
  249. - (void)refreshLoadData
  250. {
  251. dispatch_async(dispatch_get_main_queue(), ^{
  252. if (self.currentInteger > 0) {
  253. self.currentInteger = self.currentInteger-1;
  254. }
  255. self.currentInteger = self.currentInteger;
  256. [self.leftView scrollerItemAtIndex:self.currentInteger];
  257. [self.listContainerView scrollSelectedItemAtIndex:self.currentInteger];
  258. });
  259. }
  260. - (void)refreshMoreLoadData
  261. {
  262. dispatch_async(dispatch_get_main_queue(), ^{
  263. if (self.currentInteger < self.dataArray.count-1) {
  264. self.currentInteger = self.currentInteger+1;
  265. }
  266. self.currentInteger = self.currentInteger;
  267. [self.leftView scrollerItemAtIndex:self.currentInteger];
  268. [self.listContainerView scrollSelectedItemAtIndex:self.currentInteger];
  269. });
  270. }
  271. /*
  272. // Only override drawRect: if you perform custom drawing.
  273. // An empty implementation adversely affects performance during animation.
  274. - (void)drawRect:(CGRect)rect {
  275. // Drawing code
  276. }
  277. */
  278. @end