// // WidgetSpeedView.m // KulexiuForStudent // // Created by 王智 on 2022/9/13. // #import "WidgetSpeedView.h" @interface WidgetSpeedView () { CGFloat _lastPointAngle;//上一个点相对于x轴角度 CGPoint _centerPoint; } @property (weak, nonatomic) IBOutlet UIImageView *nodeImage; @property (weak, nonatomic) IBOutlet UILabel *speedLabel; @property (weak, nonatomic) IBOutlet UIView *bgView; /** 控制频率View */ @property (nonatomic, strong) UIImageView *controlSpeedView; @end @implementation WidgetSpeedView - (void)awakeFromNib { [super awakeFromNib]; [self createUI]; } + (instancetype)shareInstance { WidgetSpeedView *view = [[[NSBundle mainBundle] loadNibNamed:@"WidgetSpeedView" owner:nil options:nil] firstObject]; return view; } - (void)createUI { _centerPoint = CGPointMake(300 / 2, kScreenWidth / 2);//中心点 self.controlSpeedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"speed_dot"]]; [self.bgView addSubview:self.controlSpeedView]; [self.controlSpeedView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.right.bottom.left.mas_equalTo(self.bgView); }]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self]; //计算上一个点相对于x轴的角度 CGFloat lastPointRadius = sqrt(pow(point.y - _centerPoint.y, 2) + pow(point.x - _centerPoint.x, 2)); if (lastPointRadius == 0) { return; } _lastPointAngle = acos((point.x - _centerPoint.x) / lastPointRadius); if (point.y > _centerPoint.y) { _lastPointAngle = 2 * M_PI - _lastPointAngle; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint currentPoint = [touch locationInView:self]; // CGPoint preLocation = [touch preciseLocationInView:self]; //1.计算当前点相对于x轴的角度 CGFloat currentPointRadius = sqrt(pow(currentPoint.y - _centerPoint.y, 2) + pow(currentPoint.x - _centerPoint.x, 2)); if (currentPointRadius == 0) {//当点在中心点时,被除数不能为0 return; } CGFloat curentPointAngle = acos((currentPoint.x - _centerPoint.x) / currentPointRadius); if (currentPoint.y > _centerPoint.y) { curentPointAngle = 2 * M_PI - curentPointAngle; } //2.变化的角度 CGFloat angle = _lastPointAngle - curentPointAngle; NSLog(@"angle ----- %f",angle); // 小点点的位置 self.controlSpeedView.transform = CGAffineTransformRotate(self.controlSpeedView.transform, angle); _lastPointAngle = curentPointAngle; if (angle > 0 && angle < 1) { if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) { [self.delegate changeSpeedWithIsAdd:YES speed:MIN(1, MAX(angle *2, 1))]; } } else if(angle < 0 && angle > -1) { if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) { [self.delegate changeSpeedWithIsAdd:NO speed:MIN(1, MAX(angle *2, 1))]; } } } - (void)setSpeed:(int)speed { _speed = speed; self.speedLabel.text = [NSString stringWithFormat:@"%d", speed]; } //- (void)setCurrentType:(KSWidgeMetronomeType)currentType { // _currentType = currentType; // switch (currentType) { // case KSWidgeMetronomeType1V2: // case KSWidgeMetronomeType2V2: // { // [self.nodeImage setImage:[UIImage imageNamed:@"half_node"]]; // } // break; // case KSWidgeMetronomeType1V4: // case KSWidgeMetronomeType2V4: // case KSWidgeMetronomeType3V4: // case KSWidgeMetronomeType4V4: // { // [self.nodeImage setImage:[UIImage imageNamed:@"quarter_node"]]; // } // break; // case KSWidgeMetronomeType3V8: // case KSWidgeMetronomeType6V8: // { // [self.nodeImage setImage:[UIImage imageNamed:@"eighth_node"]]; // } // break; // case KSWidgeMetronomeType8V16: // { // [self.nodeImage setImage:[UIImage imageNamed:@"sixteenth_node"]]; // } // break; // default: // break; // } //} /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ @end