WMMenuView.m 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. //
  2. // WMMenuView.m
  3. // WMPageController
  4. //
  5. // Created by Mark on 15/4/26.
  6. // Copyright (c) 2015年 yq. All rights reserved.
  7. //
  8. #import "WMMenuView.h"
  9. @interface WMMenuView () <WMMenuItemDelegate>
  10. @property (nonatomic, weak) WMMenuItem *selItem;
  11. @property (nonatomic, strong) NSMutableArray *frames;
  12. @property (nonatomic, readonly) NSInteger titlesCount;
  13. @property (nonatomic, assign) NSInteger selectIndex;
  14. @end
  15. // 下划线的高度
  16. static CGFloat const WMProgressHeight = 2.0;
  17. static CGFloat const WMMenuItemWidth = 60.0;
  18. static NSInteger const WMMenuItemTagOffset = 6250;
  19. static NSInteger const WMBadgeViewTagOffset = 1212;
  20. @implementation WMMenuView
  21. #pragma mark - Setter
  22. - (void)setLayoutMode:(WMMenuViewLayoutMode)layoutMode {
  23. _layoutMode = layoutMode;
  24. if (!self.superview) { return; }
  25. [self reload];
  26. }
  27. - (void)setFrame:(CGRect)frame {
  28. [super setFrame:frame];
  29. if (!self.scrollView) { return; }
  30. CGFloat leftMargin = self.contentMargin + self.leftView.frame.size.width;
  31. CGFloat rightMargin = self.contentMargin + self.rightView.frame.size.width;
  32. CGFloat contentWidth = self.scrollView.frame.size.width + leftMargin + rightMargin;
  33. CGFloat startX = self.leftView ? self.leftView.frame.origin.x : self.scrollView.frame.origin.x - self.contentMargin;
  34. // Make the contentView center, because system will change menuView's frame if it's a titleView.
  35. if (startX + contentWidth / 2 != self.bounds.size.width / 2) {
  36. CGFloat xOffset = (contentWidth - self.bounds.size.width) / 2;
  37. self.scrollView.frame = ({
  38. CGRect frame = self.scrollView.frame;
  39. frame.origin.x -= xOffset;
  40. frame;
  41. });
  42. self.leftView.frame = ({
  43. CGRect frame = self.leftView.frame;
  44. frame.origin.x -= xOffset;
  45. frame;
  46. });
  47. self.rightView.frame = ({
  48. CGRect frame = self.rightView.frame;
  49. frame.origin.x -= xOffset;
  50. frame;
  51. });
  52. }
  53. }
  54. - (void)setProgressViewCornerRadius:(CGFloat)progressViewCornerRadius {
  55. _progressViewCornerRadius = progressViewCornerRadius;
  56. if (self.progressView) {
  57. self.progressView.cornerRadius = _progressViewCornerRadius;
  58. }
  59. }
  60. - (void)setSpeedFactor:(CGFloat)speedFactor {
  61. _speedFactor = speedFactor;
  62. if (self.progressView) {
  63. self.progressView.speedFactor = _speedFactor;
  64. }
  65. [self.scrollView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  66. if ([obj isKindOfClass:[WMMenuItem class]]) {
  67. ((WMMenuItem *)obj).speedFactor = _speedFactor;
  68. }
  69. }];
  70. }
  71. - (void)setProgressWidths:(NSArray *)progressWidths {
  72. _progressWidths = progressWidths;
  73. if (!self.progressView.superview) { return; }
  74. [self resetFramesFromIndex:0];
  75. }
  76. - (void)setLeftView:(UIView *)leftView {
  77. if (self.leftView) {
  78. [self.leftView removeFromSuperview];
  79. _leftView = nil;
  80. }
  81. if (leftView) {
  82. [self addSubview:leftView];
  83. _leftView = leftView;
  84. }
  85. [self resetFrames];
  86. }
  87. - (void)setRightView:(UIView *)rightView {
  88. if (self.rightView) {
  89. [self.rightView removeFromSuperview];
  90. _rightView = nil;
  91. }
  92. if (rightView) {
  93. [self addSubview:rightView];
  94. _rightView = rightView;
  95. }
  96. [self resetFrames];
  97. }
  98. - (void)setContentMargin:(CGFloat)contentMargin {
  99. _contentMargin = contentMargin;
  100. if (self.scrollView) {
  101. [self resetFrames];
  102. }
  103. }
  104. #pragma mark - Getter
  105. - (UIColor *)lineColor {
  106. if (!_lineColor) {
  107. _lineColor = self.selectedColor;
  108. }
  109. return _lineColor;
  110. }
  111. - (NSMutableArray *)frames {
  112. if (_frames == nil) {
  113. _frames = [NSMutableArray array];
  114. }
  115. return _frames;
  116. }
  117. - (UIColor *)selectedColor {
  118. if ([self.delegate respondsToSelector:@selector(menuView:titleColorForState:)]) {
  119. return [self.delegate menuView:self titleColorForState:WMMenuItemStateSelected];
  120. }
  121. return [UIColor blackColor];
  122. }
  123. - (UIColor *)normalColor {
  124. if ([self.delegate respondsToSelector:@selector(menuView:titleColorForState:)]) {
  125. return [self.delegate menuView:self titleColorForState:WMMenuItemStateNormal];
  126. }
  127. return [UIColor blackColor];
  128. }
  129. - (CGFloat)selectedSize {
  130. if ([self.delegate respondsToSelector:@selector(menuView:titleSizeForState:)]) {
  131. return [self.delegate menuView:self titleSizeForState:WMMenuItemStateSelected];
  132. }
  133. return 18.0;
  134. }
  135. - (CGFloat)normalSize {
  136. if ([self.delegate respondsToSelector:@selector(menuView:titleSizeForState:)]) {
  137. return [self.delegate menuView:self titleSizeForState:WMMenuItemStateNormal];
  138. }
  139. return 15.0;
  140. }
  141. - (UIView *)badgeViewAtIndex:(NSInteger)index {
  142. if (![self.dataSource respondsToSelector:@selector(menuView:badgeViewAtIndex:)]) {
  143. return nil;
  144. }
  145. UIView *badgeView = [self.dataSource menuView:self badgeViewAtIndex:index];
  146. if (!badgeView) {
  147. return nil;
  148. }
  149. badgeView.tag = index + WMBadgeViewTagOffset;
  150. return badgeView;
  151. }
  152. #pragma mark - Public Methods
  153. - (void)setProgressViewIsNaughty:(BOOL)progressViewIsNaughty {
  154. _progressViewIsNaughty = progressViewIsNaughty;
  155. if (self.progressView) {
  156. self.progressView.naughty = progressViewIsNaughty;
  157. }
  158. }
  159. - (void)reload {
  160. [self.frames removeAllObjects];
  161. [self.progressView removeFromSuperview];
  162. [self.scrollView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  163. [obj removeFromSuperview];
  164. }];
  165. [self addItems];
  166. [self makeStyle];
  167. }
  168. - (void)slideMenuAtProgress:(CGFloat)progress {
  169. if (self.progressView) {
  170. self.progressView.progress = progress;
  171. }
  172. NSInteger tag = (NSInteger)progress + WMMenuItemTagOffset;
  173. CGFloat rate = progress - tag + WMMenuItemTagOffset;
  174. WMMenuItem *currentItem = (WMMenuItem *)[self viewWithTag:tag];
  175. WMMenuItem *nextItem = (WMMenuItem *)[self viewWithTag:tag+1];
  176. if (rate == 0.0) {
  177. [self.selItem deselectedItemWithoutAnimation];
  178. self.selItem = currentItem;
  179. [self.selItem selectedItemWithoutAnimation];
  180. [self refreshContenOffset];
  181. return;
  182. }
  183. currentItem.rate = 1-rate;
  184. nextItem.rate = rate;
  185. }
  186. - (void)selectItemAtIndex:(NSInteger)index {
  187. NSInteger tag = index + WMMenuItemTagOffset;
  188. NSInteger currentIndex = self.selItem.tag - WMMenuItemTagOffset;
  189. self.selectIndex = index;
  190. if (index == currentIndex || !self.selItem) { return; }
  191. WMMenuItem *item = (WMMenuItem *)[self viewWithTag:tag];
  192. [self.selItem deselectedItemWithoutAnimation];
  193. self.selItem = item;
  194. [self.selItem selectedItemWithoutAnimation];
  195. [self.progressView setProgressWithOutAnimate:index];
  196. if ([self.delegate respondsToSelector:@selector(menuView:didSelesctedIndex:currentIndex:)]) {
  197. [self.delegate menuView:self didSelesctedIndex:index currentIndex:currentIndex];
  198. }
  199. [self refreshContenOffset];
  200. }
  201. - (void)updateTitle:(NSString *)title atIndex:(NSInteger)index andWidth:(BOOL)update {
  202. if (index >= self.titlesCount || index < 0) { return; }
  203. WMMenuItem *item = (WMMenuItem *)[self viewWithTag:(WMMenuItemTagOffset + index)];
  204. item.text = title;
  205. if (!update) { return; }
  206. [self resetFrames];
  207. }
  208. - (void)updateBadgeViewAtIndex:(NSInteger)index {
  209. UIView *oldBadgeView = [self.scrollView viewWithTag:WMBadgeViewTagOffset + index];
  210. if (oldBadgeView) {
  211. [oldBadgeView removeFromSuperview];
  212. }
  213. [self addBadgeViewAtIndex:index];
  214. [self resetBadgeFrame:index];
  215. }
  216. // 让选中的item位于中间
  217. - (void)refreshContenOffset {
  218. CGRect frame = self.selItem.frame;
  219. CGFloat itemX = frame.origin.x;
  220. CGFloat width = self.scrollView.frame.size.width;
  221. CGSize contentSize = self.scrollView.contentSize;
  222. if (itemX > width/2) {
  223. CGFloat targetX;
  224. if ((contentSize.width-itemX) <= width/2) {
  225. targetX = contentSize.width - width;
  226. } else {
  227. targetX = frame.origin.x - width/2 + frame.size.width/2;
  228. }
  229. // 应该有更好的解决方法
  230. if (targetX + width > contentSize.width) {
  231. targetX = contentSize.width - width;
  232. }
  233. [self.scrollView setContentOffset:CGPointMake(targetX, 0) animated:YES];
  234. } else {
  235. [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
  236. }
  237. // MARK: 暂时解决多选中问题 (需要复现并找到根本原因 see#67)
  238. [self deselectedItemsIfNeeded];
  239. }
  240. #pragma mark - Data source
  241. - (NSInteger)titlesCount {
  242. return [self.dataSource numbersOfTitlesInMenuView:self];
  243. }
  244. #pragma mark - Private Methods
  245. - (void)willMoveToSuperview:(UIView *)newSuperview {
  246. if (self.scrollView) { return; }
  247. [self addScrollView];
  248. [self addItems];
  249. [self makeStyle];
  250. [self addBadgeViews];
  251. if (self.selectIndex == 0) { return; }
  252. [self selectItemAtIndex:self.selectIndex];
  253. }
  254. - (void)resetFrames {
  255. CGRect frame = self.bounds;
  256. if (self.rightView) {
  257. CGRect rightFrame = self.rightView.frame;
  258. rightFrame.origin.x = frame.size.width - rightFrame.size.width;
  259. self.rightView.frame = rightFrame;
  260. frame.size.width -= rightFrame.size.width;
  261. }
  262. if (self.leftView) {
  263. CGRect leftFrame = self.leftView.frame;
  264. leftFrame.origin.x = 0;
  265. self.leftView.frame = leftFrame;
  266. frame.origin.x += leftFrame.size.width;
  267. frame.size.width -= leftFrame.size.width;
  268. }
  269. frame.origin.x += self.contentMargin;
  270. frame.size.width -= self.contentMargin * 2;
  271. self.scrollView.frame = frame;
  272. [self resetFramesFromIndex:0];
  273. // [self refreshContenOffset];
  274. }
  275. - (void)resetFramesFromIndex:(NSInteger)index {
  276. [self.frames removeAllObjects];
  277. [self calculateItemFrames];
  278. for (NSInteger i = index; i < self.titlesCount; i++) {
  279. [self resetItemFrame:i];
  280. [self resetBadgeFrame:i];
  281. }
  282. if (!self.progressView.superview) { return; }
  283. CGRect frame = self.progressView.frame;
  284. frame.size.width = self.scrollView.contentSize.width;
  285. if (self.style == WMMenuViewStyleLine || self.style == WMMenuViewStyleTriangle) {
  286. frame.origin.y = self.frame.size.height - self.progressHeight - self.progressViewBottomSpace;
  287. } else {
  288. frame.origin.y = (self.scrollView.frame.size.height - frame.size.height) / 2.0;
  289. }
  290. self.progressView.frame = frame;
  291. self.progressView.itemFrames = [self convertProgressWidthsToFrames];
  292. [self.progressView setNeedsDisplay];
  293. }
  294. - (void)resetItemFrame:(NSInteger)index {
  295. WMMenuItem *item = (WMMenuItem *)[self viewWithTag:(WMMenuItemTagOffset + index)];
  296. CGRect frame = [self.frames[index] CGRectValue];
  297. item.frame = frame;
  298. if ([self.delegate respondsToSelector:@selector(menuView:didLayoutItemFrame:atIndex:)]) {
  299. [self.delegate menuView:self didLayoutItemFrame:item atIndex:index];
  300. }
  301. }
  302. - (void)resetBadgeFrame:(NSInteger)index {
  303. CGRect frame = [self.frames[index] CGRectValue];
  304. UIView *badgeView = [self.scrollView viewWithTag:(WMBadgeViewTagOffset + index)];
  305. if (badgeView) {
  306. CGRect badgeFrame = [self badgeViewAtIndex:index].frame;
  307. badgeFrame.origin.x += frame.origin.x;
  308. badgeView.frame = badgeFrame;
  309. }
  310. }
  311. - (NSArray *)convertProgressWidthsToFrames {
  312. if (!self.frames.count) { NSAssert(NO, @"BUUUUUUUG...SHOULDN'T COME HERE!!"); }
  313. if (self.progressWidths.count) {
  314. NSMutableArray *progressFrames = [NSMutableArray array];
  315. for (int i = 0; i < self.frames.count; i++) {
  316. CGRect itemFrame = [self.frames[i] CGRectValue];
  317. CGFloat progressWidth = [self.progressWidths[i] floatValue];
  318. CGFloat x = itemFrame.origin.x + (itemFrame.size.width - progressWidth) / 2;
  319. CGRect progressFrame = CGRectMake(x, itemFrame.origin.y, progressWidth, 0);
  320. [progressFrames addObject:[NSValue valueWithCGRect:progressFrame]];
  321. }
  322. return progressFrames.copy;
  323. }
  324. return self.frames;
  325. }
  326. - (void)addBadgeViews {
  327. for (int i = 0; i < self.titlesCount; i++) {
  328. [self addBadgeViewAtIndex:i];
  329. }
  330. }
  331. - (void)addBadgeViewAtIndex:(NSInteger)index {
  332. UIView *badgeView = [self badgeViewAtIndex:index];
  333. if (badgeView) {
  334. [self.scrollView addSubview:badgeView];
  335. }
  336. }
  337. - (void)makeStyle {
  338. CGRect frame = CGRectZero;
  339. if (self.style == WMMenuViewStyleDefault) { return; }
  340. if (self.style == WMMenuViewStyleLine) {
  341. self.progressHeight = self.progressHeight > 0 ? self.progressHeight : WMProgressHeight;
  342. frame = CGRectMake(0, self.frame.size.height - self.progressHeight - self.progressViewBottomSpace, self.scrollView.contentSize.width, self.progressHeight);
  343. } else {
  344. self.progressHeight = self.progressHeight > 0 ? self.progressHeight : self.frame.size.height * 0.8;
  345. frame = CGRectMake(0, (self.frame.size.height - self.progressHeight) / 2, self.scrollView.contentSize.width, self.progressHeight);
  346. }
  347. self.progressViewCornerRadius = self.progressViewCornerRadius > 0 ? self.progressViewCornerRadius : self.progressHeight / 2.0;
  348. [self wm_addProgressViewWithFrame:frame
  349. isTriangle:(self.style == WMMenuViewStyleTriangle)
  350. hasBorder:(self.style == WMMenuViewStyleSegmented)
  351. hollow:(self.style == WMMenuViewStyleFloodHollow)
  352. cornerRadius:self.progressViewCornerRadius];
  353. }
  354. - (void)deselectedItemsIfNeeded {
  355. [self.scrollView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  356. if ([obj isKindOfClass:[WMMenuItem class]]) {
  357. WMMenuItem *item = (WMMenuItem *)obj;
  358. if (item != self.selItem && item.selected == YES) {
  359. [item deselectedItemWithoutAnimation];
  360. }
  361. }
  362. }];
  363. }
  364. - (void)addScrollView {
  365. CGFloat width = self.frame.size.width - self.contentMargin * 2;
  366. CGFloat height = self.frame.size.height;
  367. CGRect frame = CGRectMake(self.contentMargin, 0, width, height);
  368. UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
  369. scrollView.showsHorizontalScrollIndicator = NO;
  370. scrollView.showsVerticalScrollIndicator = NO;
  371. scrollView.backgroundColor = [UIColor clearColor];
  372. scrollView.scrollsToTop = NO;
  373. [self addSubview:scrollView];
  374. self.scrollView = scrollView;
  375. }
  376. - (void)addItems {
  377. [self calculateItemFrames];
  378. for (int i = 0; i < self.titlesCount; i++) {
  379. CGRect frame = [self.frames[i] CGRectValue];
  380. WMMenuItem *item = [[WMMenuItem alloc] initWithFrame:frame];
  381. if (self.fontName) {
  382. item.font = [UIFont fontWithName:self.fontName size:self.selectedSize];
  383. } else {
  384. item.font = [UIFont systemFontOfSize:self.selectedSize];
  385. }
  386. item.tag = (i+WMMenuItemTagOffset);
  387. item.delegate = self;
  388. item.text = [self.dataSource menuView:self titleAtIndex:i];
  389. item.textAlignment = NSTextAlignmentCenter;
  390. if ([self.dataSource respondsToSelector:@selector(menuView:initialMenuItem:atIndex:)]) {
  391. item = [self.dataSource menuView:self initialMenuItem:item atIndex:i];
  392. }
  393. item.userInteractionEnabled = YES;
  394. item.backgroundColor = [UIColor clearColor];
  395. item.normalSize = self.normalSize;
  396. item.selectedSize = self.selectedSize;
  397. item.normalColor = self.normalColor;
  398. item.selectedColor = self.selectedColor;
  399. item.speedFactor = self.speedFactor;
  400. if (i == 0) {
  401. [item selectedItemWithoutAnimation];
  402. self.selItem = item;
  403. } else {
  404. [item deselectedItemWithoutAnimation];
  405. }
  406. [self.scrollView addSubview:item];
  407. }
  408. }
  409. // 计算所有item的frame值,主要是为了适配所有item的宽度之和小于屏幕宽的情况
  410. // 这里与后面的 `-addItems` 做了重复的操作,并不是很合理
  411. - (void)calculateItemFrames {
  412. CGFloat contentWidth = [self itemMarginAtIndex:0];
  413. for (int i = 0; i < self.titlesCount; i++) {
  414. CGFloat itemW = WMMenuItemWidth;
  415. if ([self.delegate respondsToSelector:@selector(menuView:widthForItemAtIndex:)]) {
  416. itemW = [self.delegate menuView:self widthForItemAtIndex:i];
  417. }
  418. CGRect frame = CGRectMake(contentWidth, 0, itemW, self.frame.size.height);
  419. // 记录frame
  420. [self.frames addObject:[NSValue valueWithCGRect:frame]];
  421. contentWidth += itemW + [self itemMarginAtIndex:i+1];
  422. }
  423. // // 如果总宽度小于屏幕宽,重新计算frame,为item间添加间距
  424. // if (contentWidth < self.scrollView.frame.size.width) {
  425. // CGFloat distance = self.scrollView.frame.size.width - contentWidth;
  426. // CGFloat (^shiftDis)(int);
  427. // switch (self.layoutMode) {
  428. // case WMMenuViewLayoutModeScatter: {
  429. // CGFloat gap = distance / (self.titlesCount + 1);
  430. // shiftDis = ^CGFloat(int index) { return gap * (index + 1); };
  431. // break;
  432. // }
  433. // case WMMenuViewLayoutModeLeft: {
  434. // shiftDis = ^CGFloat(int index) { return 0.0; };
  435. // break;
  436. // }
  437. // case WMMenuViewLayoutModeRight: {
  438. // shiftDis = ^CGFloat(int index) { return distance; };
  439. // break;
  440. // }
  441. // case WMMenuViewLayoutModeCenter: {
  442. // shiftDis = ^CGFloat(int index) { return distance / 2; };
  443. // break;
  444. // }
  445. // }
  446. // for (int i = 0; i < self.frames.count; i++) {
  447. // CGRect frame = [self.frames[i] CGRectValue];
  448. // frame.origin.x += shiftDis(i);
  449. // self.frames[i] = [NSValue valueWithCGRect:frame];
  450. // }
  451. // contentWidth = self.scrollView.frame.size.width;
  452. // }
  453. self.scrollView.contentSize = CGSizeMake(contentWidth, self.frame.size.height);
  454. }
  455. - (CGFloat)itemMarginAtIndex:(NSInteger)index {
  456. if ([self.delegate respondsToSelector:@selector(menuView:itemMarginAtIndex:)]) {
  457. return [self.delegate menuView:self itemMarginAtIndex:index];
  458. }
  459. return 0.0;
  460. }
  461. // MARK:Progress View
  462. - (void)wm_addProgressViewWithFrame:(CGRect)frame isTriangle:(BOOL)isTriangle hasBorder:(BOOL)hasBorder hollow:(BOOL)isHollow cornerRadius:(CGFloat)cornerRadius {
  463. WMProgressView *pView = [[WMProgressView alloc] initWithFrame:frame];
  464. pView.itemFrames = [self convertProgressWidthsToFrames];
  465. pView.color = self.lineColor.CGColor;
  466. pView.isTriangle = isTriangle;
  467. pView.hasBorder = hasBorder;
  468. pView.hollow = isHollow;
  469. pView.cornerRadius = cornerRadius;
  470. pView.naughty = self.progressViewIsNaughty;
  471. pView.speedFactor = self.speedFactor;
  472. pView.backgroundColor = [UIColor clearColor];
  473. self.progressView = pView;
  474. [self.scrollView insertSubview:self.progressView atIndex:0];
  475. }
  476. #pragma mark - Menu item delegate
  477. - (void)didPressedMenuItem:(WMMenuItem *)menuItem {
  478. if (self.selItem == menuItem) return;
  479. CGFloat progress = menuItem.tag - WMMenuItemTagOffset;
  480. [self.progressView moveToPostion:progress];
  481. NSInteger currentIndex = self.selItem.tag - WMMenuItemTagOffset;
  482. if ([self.delegate respondsToSelector:@selector(menuView:didSelesctedIndex:currentIndex:)]) {
  483. [self.delegate menuView:self didSelesctedIndex:menuItem.tag-WMMenuItemTagOffset currentIndex:currentIndex];
  484. }
  485. menuItem.selected = YES;
  486. self.selItem.selected = NO;
  487. self.selItem = menuItem;
  488. NSTimeInterval delay = self.style == WMMenuViewStyleDefault ? 0 : 0.3f;
  489. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  490. // 让选中的item位于中间
  491. [self refreshContenOffset];
  492. });
  493. }
  494. @end