109 lines
3.2 KiB
Objective-C
Executable File
109 lines
3.2 KiB
Objective-C
Executable File
//
|
|
// WMMenuItem.m
|
|
// WMPageController
|
|
//
|
|
// Created by Mark on 15/4/26.
|
|
// Copyright (c) 2015年 yq. All rights reserved.
|
|
//
|
|
|
|
#import "WMMenuItem.h"
|
|
|
|
@implementation WMMenuItem {
|
|
CGFloat _selectedRed, _selectedGreen, _selectedBlue, _selectedAlpha;
|
|
CGFloat _normalRed, _normalGreen, _normalBlue, _normalAlpha;
|
|
int _sign;
|
|
CGFloat _gap;
|
|
CGFloat _step;
|
|
__weak CADisplayLink *_link;
|
|
}
|
|
|
|
#pragma mark - Public Methods
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
if (self = [super initWithFrame:frame]) {
|
|
self.normalColor = [UIColor blackColor];
|
|
self.selectedColor = [UIColor blackColor];
|
|
self.normalSize = 15;
|
|
self.selectedSize = 18;
|
|
self.numberOfLines = 0;
|
|
|
|
[self setupGestureRecognizer];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (CGFloat)speedFactor {
|
|
if (_speedFactor <= 0) {
|
|
_speedFactor = 15.0;
|
|
}
|
|
return _speedFactor;
|
|
}
|
|
|
|
- (void)setupGestureRecognizer {
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchUpInside:)];
|
|
[self addGestureRecognizer:tap];
|
|
}
|
|
|
|
- (void)setSelected:(BOOL)selected withAnimation:(BOOL)animation {
|
|
_selected = selected;
|
|
if (!animation) {
|
|
self.rate = selected ? 1.0 : 0.0;
|
|
return;
|
|
}
|
|
_sign = (selected == YES) ? 1 : -1;
|
|
_gap = (selected == YES) ? (1.0 - self.rate) : (self.rate - 0.0);
|
|
_step = _gap / self.speedFactor;
|
|
if (_link) {
|
|
[_link invalidate];
|
|
}
|
|
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(rateChange)];
|
|
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
|
|
_link = link;
|
|
}
|
|
|
|
- (void)rateChange {
|
|
if (_gap > 0.000001) {
|
|
_gap -= _step;
|
|
if (_gap < 0.0) {
|
|
self.rate = (int)(self.rate + _sign * _step + 0.5);
|
|
return;
|
|
}
|
|
self.rate += _sign * _step;
|
|
} else {
|
|
self.rate = (int)(self.rate + 0.5);
|
|
[_link invalidate];
|
|
_link = nil;
|
|
}
|
|
}
|
|
|
|
// 设置rate,并刷新标题状态
|
|
- (void)setRate:(CGFloat)rate {
|
|
if (rate < 0.0 || rate > 1.0) { return; }
|
|
_rate = rate;
|
|
CGFloat r = _normalRed + (_selectedRed - _normalRed) * rate;
|
|
CGFloat g = _normalGreen + (_selectedGreen - _normalGreen) * rate;
|
|
CGFloat b = _normalBlue + (_selectedBlue - _normalBlue) * rate;
|
|
CGFloat a = _normalAlpha + (_selectedAlpha - _normalAlpha) * rate;
|
|
self.textColor = [UIColor colorWithRed:r green:g blue:b alpha:a];
|
|
CGFloat minScale = self.normalSize / self.selectedSize;
|
|
CGFloat trueScale = minScale + (1 - minScale)*rate;
|
|
self.transform = CGAffineTransformMakeScale(trueScale, trueScale);
|
|
}
|
|
|
|
- (void)setSelectedColor:(UIColor *)selectedColor {
|
|
_selectedColor = selectedColor;
|
|
[selectedColor getRed:&_selectedRed green:&_selectedGreen blue:&_selectedBlue alpha:&_selectedAlpha];
|
|
}
|
|
|
|
- (void)setNormalColor:(UIColor *)normalColor {
|
|
_normalColor = normalColor;
|
|
[normalColor getRed:&_normalRed green:&_normalGreen blue:&_normalBlue alpha:&_normalAlpha];
|
|
}
|
|
|
|
- (void)touchUpInside:(id)sender {
|
|
if ([self.delegate respondsToSelector:@selector(didPressedMenuItem:)]) {
|
|
[self.delegate didPressedMenuItem:self];
|
|
}
|
|
}
|
|
|
|
@end
|