WidgetSpeedView.m 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // WidgetSpeedView.m
  3. // KulexiuForStudent
  4. //
  5. // Created by 王智 on 2022/9/13.
  6. //
  7. #import "WidgetSpeedView.h"
  8. @interface WidgetSpeedView ()
  9. {
  10. CGFloat _lastPointAngle;//上一个点相对于x轴角度
  11. CGPoint _centerPoint;
  12. }
  13. @property (weak, nonatomic) IBOutlet UIImageView *nodeImage;
  14. @property (weak, nonatomic) IBOutlet UILabel *speedLabel;
  15. @property (weak, nonatomic) IBOutlet UIView *bgView;
  16. /** 控制频率View */
  17. @property (nonatomic, strong) UIImageView *controlSpeedView;
  18. @end
  19. @implementation WidgetSpeedView
  20. - (void)awakeFromNib {
  21. [super awakeFromNib];
  22. [self createUI];
  23. }
  24. + (instancetype)shareInstance {
  25. WidgetSpeedView *view = [[[NSBundle mainBundle] loadNibNamed:@"WidgetSpeedView" owner:nil options:nil] firstObject];
  26. return view;
  27. }
  28. - (void)createUI {
  29. _centerPoint = CGPointMake(300 / 2, kScreenWidth / 2);//中心点
  30. self.controlSpeedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"speed_dot"]];
  31. [self.bgView addSubview:self.controlSpeedView];
  32. [self.controlSpeedView mas_makeConstraints:^(MASConstraintMaker *make) {
  33. make.top.right.bottom.left.mas_equalTo(self.bgView);
  34. }];
  35. }
  36. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  37. UITouch *touch = [touches anyObject];
  38. CGPoint point = [touch locationInView:self];
  39. //计算上一个点相对于x轴的角度
  40. CGFloat lastPointRadius = sqrt(pow(point.y - _centerPoint.y, 2) + pow(point.x - _centerPoint.x, 2));
  41. if (lastPointRadius == 0) {
  42. return;
  43. }
  44. _lastPointAngle = acos((point.x - _centerPoint.x) / lastPointRadius);
  45. if (point.y > _centerPoint.y) {
  46. _lastPointAngle = 2 * M_PI - _lastPointAngle;
  47. }
  48. }
  49. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  50. UITouch *touch = [touches anyObject];
  51. CGPoint currentPoint = [touch locationInView:self];
  52. // CGPoint preLocation = [touch preciseLocationInView:self];
  53. //1.计算当前点相对于x轴的角度
  54. CGFloat currentPointRadius = sqrt(pow(currentPoint.y - _centerPoint.y, 2) + pow(currentPoint.x - _centerPoint.x, 2));
  55. if (currentPointRadius == 0) {//当点在中心点时,被除数不能为0
  56. return;
  57. }
  58. CGFloat curentPointAngle = acos((currentPoint.x - _centerPoint.x) / currentPointRadius);
  59. if (currentPoint.y > _centerPoint.y) {
  60. curentPointAngle = 2 * M_PI - curentPointAngle;
  61. }
  62. //2.变化的角度
  63. CGFloat angle = _lastPointAngle - curentPointAngle;
  64. NSLog(@"angle ----- %f",angle);
  65. // 小点点的位置
  66. self.controlSpeedView.transform = CGAffineTransformRotate(self.controlSpeedView.transform, angle);
  67. _lastPointAngle = curentPointAngle;
  68. if (angle > 0 && angle < 1) {
  69. if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) {
  70. [self.delegate changeSpeedWithIsAdd:YES speed:MIN(1, MAX(angle *2, 1))];
  71. }
  72. }
  73. else if(angle < 0 && angle > -1) {
  74. if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) {
  75. [self.delegate changeSpeedWithIsAdd:NO speed:MIN(1, MAX(angle *2, 1))];
  76. }
  77. }
  78. }
  79. - (void)setSpeed:(int)speed {
  80. _speed = speed;
  81. self.speedLabel.text = [NSString stringWithFormat:@"%d", speed];
  82. }
  83. //- (void)setCurrentType:(KSWidgeMetronomeType)currentType {
  84. // _currentType = currentType;
  85. // switch (currentType) {
  86. // case KSWidgeMetronomeType1V2:
  87. // case KSWidgeMetronomeType2V2:
  88. // {
  89. // [self.nodeImage setImage:[UIImage imageNamed:@"half_node"]];
  90. // }
  91. // break;
  92. // case KSWidgeMetronomeType1V4:
  93. // case KSWidgeMetronomeType2V4:
  94. // case KSWidgeMetronomeType3V4:
  95. // case KSWidgeMetronomeType4V4:
  96. // {
  97. // [self.nodeImage setImage:[UIImage imageNamed:@"quarter_node"]];
  98. // }
  99. // break;
  100. // case KSWidgeMetronomeType3V8:
  101. // case KSWidgeMetronomeType6V8:
  102. // {
  103. // [self.nodeImage setImage:[UIImage imageNamed:@"eighth_node"]];
  104. // }
  105. // break;
  106. // case KSWidgeMetronomeType8V16:
  107. // {
  108. // [self.nodeImage setImage:[UIImage imageNamed:@"sixteenth_node"]];
  109. // }
  110. // break;
  111. // default:
  112. // break;
  113. // }
  114. //}
  115. /*
  116. // Only override drawRect: if you perform custom drawing.
  117. // An empty implementation adversely affects performance during animation.
  118. - (void)drawRect:(CGRect)rect {
  119. // Drawing code
  120. }
  121. */
  122. @end