WMMenuItem.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // WMMenuItem.m
  3. // WMPageController
  4. //
  5. // Created by Mark on 15/4/26.
  6. // Copyright (c) 2015年 yq. All rights reserved.
  7. //
  8. #import "WMMenuItem.h"
  9. @interface WMMenuItem () {
  10. CGFloat _selectedRed, _selectedGreen, _selectedBlue, _selectedAlpha;
  11. CGFloat _normalRed, _normalGreen, _normalBlue, _normalAlpha;
  12. int _sign;
  13. CGFloat _gap;
  14. CGFloat _step;
  15. __weak CADisplayLink *_link;
  16. }
  17. @end
  18. @implementation WMMenuItem
  19. #pragma mark - Public Methods
  20. - (instancetype)initWithFrame:(CGRect)frame {
  21. if (self = [super initWithFrame:frame]) {
  22. self.normalColor = [UIColor blackColor];
  23. self.selectedColor = [UIColor blackColor];
  24. self.normalSize = 15;
  25. self.selectedSize = 18;
  26. self.numberOfLines = 0;
  27. }
  28. return self;
  29. }
  30. - (CGFloat)speedFactor {
  31. if (_speedFactor <= 0) {
  32. _speedFactor = 15.0;
  33. }
  34. return _speedFactor;
  35. }
  36. // 设置选中,隐式动画所在
  37. - (void)setSelected:(BOOL)selected {
  38. if (self.selected == selected) { return; }
  39. _selected = selected;
  40. _sign = (selected == YES) ? 1 : -1;
  41. _gap = 1.0;
  42. _step = _gap / self.speedFactor;
  43. if (_link) {
  44. [_link invalidate];
  45. [_link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
  46. }
  47. CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(rateChange)];
  48. [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
  49. _link = link;
  50. }
  51. - (void)rateChange {
  52. if (_gap > 0.000001) {
  53. _gap -= _step;
  54. if (_gap < 0.0) {
  55. self.rate = (int)(self.rate + _sign * _step + 0.5);
  56. return;
  57. }
  58. self.rate += _sign * _step;
  59. } else {
  60. self.rate = (int)(self.rate + 0.5);
  61. [_link invalidate];
  62. _link = nil;
  63. }
  64. }
  65. // 设置rate,并刷新标题状态
  66. - (void)setRate:(CGFloat)rate {
  67. _rate = rate;
  68. CGFloat r = _normalRed + (_selectedRed - _normalRed) * rate;
  69. CGFloat g = _normalGreen + (_selectedGreen - _normalGreen) * rate;
  70. CGFloat b = _normalBlue + (_selectedBlue - _normalBlue) * rate;
  71. CGFloat a = _normalAlpha + (_selectedAlpha - _normalAlpha) * rate;
  72. self.textColor = [UIColor colorWithRed:r green:g blue:b alpha:a];
  73. CGFloat minScale = self.normalSize / self.selectedSize;
  74. CGFloat trueScale = minScale + (1 - minScale)*rate;
  75. self.transform = CGAffineTransformMakeScale(trueScale, trueScale);
  76. }
  77. - (void)selectedItemWithoutAnimation {
  78. self.rate = 1.0;
  79. _selected = YES;
  80. }
  81. - (void)deselectedItemWithoutAnimation {
  82. self.rate = 0;
  83. _selected = NO;
  84. }
  85. - (void)setSelectedColor:(UIColor *)selectedColor {
  86. _selectedColor = selectedColor;
  87. [selectedColor getRed:&_selectedRed green:&_selectedGreen blue:&_selectedBlue alpha:&_selectedAlpha];
  88. }
  89. - (void)setNormalColor:(UIColor *)normalColor {
  90. _normalColor = normalColor;
  91. [normalColor getRed:&_normalRed green:&_normalGreen blue:&_normalBlue alpha:&_normalAlpha];
  92. }
  93. #pragma mark - Private Methods
  94. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  95. if ([self.delegate respondsToSelector:@selector(didPressedMenuItem:)]) {
  96. [self.delegate didPressedMenuItem:self];
  97. }
  98. }
  99. @end