PageMenuScrollView.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //
  2. // PageMenuScrollView.m
  3. // CommonLibrary
  4. //
  5. // Created by Alexi on 15/4/21.
  6. // Copyright (c) 2015年 Alexi Chen. All rights reserved.
  7. //
  8. #import "PageMenuScrollView.h"
  9. #import "MenuButton.h"
  10. #import "UIView+Layout.h"
  11. #import "UIView+CustomAutoLayout.h"
  12. @interface PageMenuItem ()
  13. @property (nonatomic, strong) id<MenuAbleItem> menu;
  14. @property (nonatomic, strong) UIView *page;
  15. @end
  16. @implementation PageMenuItem
  17. - (instancetype)initWith:(id<MenuAbleItem>)menu page:(UIView *)page
  18. {
  19. if (self = [super init])
  20. {
  21. self.menu = menu;
  22. self.page = page;
  23. }
  24. return self;
  25. }
  26. @end
  27. @implementation PageMenuScrollView
  28. - (instancetype)initWithPageMenus:(NSArray *)menuPages
  29. {
  30. if (self = [super initWithFrame:CGRectZero])
  31. {
  32. _menuPages = [NSArray arrayWithArray:menuPages];
  33. _menuButtons = [NSMutableArray array];
  34. [self addOwnViews];
  35. [self configOwnViews];
  36. }
  37. return self;
  38. }
  39. - (void)onClickedMenu:(id<MenuAbleItem>)menuView
  40. {
  41. }
  42. - (void)addOwnViews
  43. {
  44. _menuScrollView = [[UIScrollView alloc] init];
  45. [self addSubview:_menuScrollView];
  46. _pageScrollView = [[UIScrollView alloc] init];
  47. _pageScrollView.pagingEnabled = YES;
  48. _pageScrollView.delegate = self;
  49. [self addSubview:_pageScrollView];
  50. __weak id ws = self;
  51. for (PageMenuItem *item in _menuPages)
  52. {
  53. id<MenuAbleItem> menu = [item menu];
  54. MenuButton *button = [[MenuButton alloc] initWithMenu:menu];
  55. [button setClickAction:^(id<MenuAbleItem> btn) {
  56. [ws onClickedMenu:btn];
  57. }];
  58. [_menuScrollView addSubview:button];
  59. [_menuButtons addObject:button];
  60. UIView *page = [item page];
  61. [_pageScrollView addSubview:page];
  62. }
  63. _selectIndexView = [[UIView alloc] init];
  64. _selectIndexView.backgroundColor = kNavBarThemeColor;
  65. [_menuScrollView addSubview:_selectIndexView];
  66. }
  67. - (void)changeMenuButtonsToNormalState
  68. {
  69. for (UIButton *vButton in _menuButtons)
  70. {
  71. vButton.selected = NO;
  72. }
  73. }
  74. - (void)changeSelectedIndex:(BOOL)animated
  75. {
  76. UIButton *btn = [_menuButtons objectAtIndex:_selectedIndex];
  77. CGRect rect = btn.frame;
  78. rect.origin.y += rect.size.height - 3;
  79. rect.size.height = 3;
  80. if (animated)
  81. {
  82. [UIView animateWithDuration:0.25 animations:^{
  83. _selectIndexView.frame = rect;
  84. }];
  85. }
  86. else
  87. {
  88. _selectIndexView.frame = rect;
  89. }
  90. [self changeMenuButtonsToNormalState];
  91. btn.selected = YES;
  92. [self moveScrolViewToIndex:_selectedIndex];
  93. }
  94. - (void)moveScrolViewToIndex:(NSInteger)aIndex
  95. {
  96. if (aIndex >= 0 && _menuButtons.count < aIndex) {
  97. return;
  98. }
  99. if (!_canScrollMenu)
  100. {
  101. return;
  102. }
  103. UIButton *btn = [_menuButtons objectAtIndex:aIndex];
  104. CGRect rect = btn.frame;
  105. if (rect.origin.x + rect.size.width > _menuScrollView.contentOffset.x + _menuScrollView.bounds.size.width ||rect.origin.x < _menuScrollView.contentOffset.x)
  106. {
  107. [_menuScrollView scrollRectToVisible:rect animated:YES];
  108. }
  109. }
  110. #define kMenuHeight 40
  111. - (void)relayoutFrameOfSubViews
  112. {
  113. CGRect rect = self.bounds;
  114. CGRect menuSVRect = rect;
  115. menuSVRect.size.height = kMenuHeight;
  116. _menuScrollView.frame = menuSVRect;
  117. rect.origin.y += kMenuHeight;
  118. rect.size.height -= kMenuHeight;
  119. CGFloat menuWidth = menuSVRect.size.width / _menuButtons.count;
  120. if (menuWidth < 100)
  121. {
  122. _canScrollMenu = YES;
  123. // 可滑动
  124. menuWidth = 100;
  125. }
  126. else
  127. {
  128. _canScrollMenu = NO;
  129. }
  130. [_menuScrollView gridViews:_menuButtons inColumn:_menuButtons.count size:CGSizeMake(menuWidth, kMenuHeight) margin:CGSizeMake(0, 0) inRect:_menuScrollView.bounds];
  131. [_menuScrollView setContentSize:CGSizeMake(menuWidth * _menuButtons.count, 0)];
  132. _selectIndexView.bounds = CGRectMake(0, 0, menuWidth, kMenuHeight);
  133. [self changeSelectedIndex:NO];
  134. _pageScrollView.frame = rect;
  135. rect = _pageScrollView.bounds;
  136. for (PageMenuItem *item in _menuPages)
  137. {
  138. UIView *view = [item page];
  139. [view setFrameAndLayout:rect];
  140. rect.origin.x += rect.size.width;
  141. }
  142. [_pageScrollView setContentSize:CGSizeMake(rect.size.width * _menuPages.count, rect.size.height)];
  143. }
  144. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
  145. {
  146. if (_pageScrollView == scrollView)
  147. {
  148. }
  149. }
  150. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  151. {
  152. if (_pageScrollView == scrollView)
  153. {
  154. int page = (scrollView.contentOffset.x + scrollView.bounds.size.width/2) / 320;
  155. if (_selectedIndex == page)
  156. {
  157. return;
  158. }
  159. _selectedIndex = page;
  160. [self changeSelectedIndex:YES];
  161. }
  162. }
  163. @end