CGXVerticalMenuMoreView.m 12 KB

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