2025-04-21 18:27:31 +08:00

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