WMMenuView.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // WMMenuView.h
  3. // WMPageController
  4. //
  5. // Created by Mark on 15/4/26.
  6. // Copyright (c) 2015年 yq. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "WMMenuItem.h"
  10. #import "WMProgressView.h"
  11. @class WMMenuView;
  12. typedef NS_ENUM(NSUInteger, WMMenuViewStyle) {
  13. WMMenuViewStyleDefault, // 默认
  14. WMMenuViewStyleLine, // 带下划线 (若要选中字体大小不变,设置选中和非选中大小一样即可)
  15. WMMenuViewStyleTriangle, // 三角形 (progressHeight 为三角形的高, progressWidths 为底边长)
  16. WMMenuViewStyleFlood, // 涌入效果 (填充)
  17. WMMenuViewStyleFloodHollow, // 涌入效果 (空心的)
  18. WMMenuViewStyleSegmented, // 涌入带边框,即网易新闻选项卡
  19. };
  20. // 原先基础上添加了几个方便布局的枚举,更多布局格式可以通过设置 `itemsMargins` 属性来自定义
  21. // 以下布局均只在 item 个数较少的情况下生效,即无法滚动 MenuView 时.
  22. typedef NS_ENUM(NSUInteger, WMMenuViewLayoutMode) {
  23. WMMenuViewLayoutModeScatter, // 默认的布局模式, item 会均匀分布在屏幕上,呈分散状
  24. WMMenuViewLayoutModeLeft, // Item 紧靠屏幕左侧
  25. WMMenuViewLayoutModeRight, // Item 紧靠屏幕右侧
  26. WMMenuViewLayoutModeCenter, // Item 紧挨且居中分布
  27. };
  28. @protocol WMMenuViewDelegate <NSObject>
  29. @optional
  30. - (void)menuView:(WMMenuView *)menu didSelesctedIndex:(NSInteger)index currentIndex:(NSInteger)currentIndex;
  31. - (CGFloat)menuView:(WMMenuView *)menu widthForItemAtIndex:(NSInteger)index;
  32. - (CGFloat)menuView:(WMMenuView *)menu itemMarginAtIndex:(NSInteger)index;
  33. - (CGFloat)menuView:(WMMenuView *)menu titleSizeForState:(WMMenuItemState)state;
  34. - (UIColor *)menuView:(WMMenuView *)menu titleColorForState:(WMMenuItemState)state;
  35. - (void)menuView:(WMMenuView *)menu didLayoutItemFrame:(WMMenuItem *)menuItem atIndex:(NSInteger)index;
  36. @end
  37. @protocol WMMenuViewDataSource <NSObject>
  38. @required
  39. - (NSInteger)numbersOfTitlesInMenuView:(WMMenuView *)menu;
  40. - (NSString *)menuView:(WMMenuView *)menu titleAtIndex:(NSInteger)index;
  41. @optional
  42. /**
  43. * 角标 (例如消息提醒的小红点) 的数据源方法,在 WMPageController 中实现这个方法来为 menuView 提供一个 badgeView
  44. 需要在返回的时候同时设置角标的 frame 属性,该 frame 为相对于 menuItem 的位置
  45. *
  46. * @param index 角标的序号
  47. *
  48. * @return 返回一个设置好 frame 的角标视图
  49. */
  50. - (UIView *)menuView:(WMMenuView *)menu badgeViewAtIndex:(NSInteger)index;
  51. /**
  52. * 用于定制 WMMenuItem,可以对传出的 initialMenuItem 进行修改定制,也可以返回自己创建的子类,需要注意的是,此时的 item 的 frame 是不确定的,所以请勿根据此时的 frame 做计算!
  53. 如需根据 frame 修改,请使用代理
  54. *
  55. * @param menu 当前的 menuView,frame 也是不确定的
  56. * @param initialMenuItem 初始化完成的 menuItem
  57. * @param index Item 所属的位置;
  58. *
  59. * @return 定制完成的 MenuItem
  60. */
  61. - (WMMenuItem *)menuView:(WMMenuView *)menu initialMenuItem:(WMMenuItem *)initialMenuItem atIndex:(NSInteger)index;
  62. @end
  63. @interface WMMenuView : UIView
  64. @property (nonatomic, strong) NSArray *progressWidths;
  65. @property (nonatomic, weak) WMProgressView *progressView;
  66. @property (nonatomic, assign) CGFloat progressHeight;
  67. @property (nonatomic, assign) WMMenuViewStyle style;
  68. @property (nonatomic, assign) WMMenuViewLayoutMode layoutMode;
  69. @property (nonatomic, assign) CGFloat contentMargin;
  70. @property (nonatomic, strong) UIColor *lineColor;
  71. @property (nonatomic, assign) CGFloat progressViewBottomSpace;
  72. @property (nonatomic, weak) id<WMMenuViewDelegate> delegate;
  73. @property (nonatomic, weak) id<WMMenuViewDataSource> dataSource;
  74. @property (nonatomic, weak) UIView *leftView;
  75. @property (nonatomic, weak) UIView *rightView;
  76. @property (nonatomic, copy) NSString *fontName;
  77. @property (nonatomic, readonly) CGFloat selectedSize;
  78. @property (nonatomic, readonly) CGFloat normalSize;
  79. @property (nonatomic, readonly) UIColor *selectedColor;
  80. @property (nonatomic, readonly) UIColor *normalColor;
  81. @property (nonatomic, weak) UIScrollView *scrollView;
  82. /** 进度条的速度因数,默认为 15,越小越快, 大于 0 */
  83. @property (nonatomic, assign) CGFloat speedFactor;
  84. @property (nonatomic, assign) CGFloat progressViewCornerRadius;
  85. @property (nonatomic, assign) BOOL progressViewIsNaughty;
  86. - (void)slideMenuAtProgress:(CGFloat)progress;
  87. - (void)selectItemAtIndex:(NSInteger)index;
  88. - (void)resetFrames;
  89. - (void)reload;
  90. - (void)updateTitle:(NSString *)title atIndex:(NSInteger)index andWidth:(BOOL)update;
  91. /// 立即刷新 menuView 的 contentOffset,使 title 居中
  92. - (void)refreshContenOffset;
  93. /**
  94. * 更新角标视图,如要移除,在 -menuView:badgeViewAtIndex: 中返回 nil 即可
  95. */
  96. - (void)updateBadgeViewAtIndex:(NSInteger)index;
  97. @end