WidgetSpeedView.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. //1.计算当前点相对于x轴的角度
  53. CGFloat currentPointRadius = sqrt(pow(currentPoint.y - _centerPoint.y, 2) + pow(currentPoint.x - _centerPoint.x, 2));
  54. if (currentPointRadius == 0) {//当点在中心点时,被除数不能为0
  55. return;
  56. }
  57. CGFloat curentPointAngle = acos((currentPoint.x - _centerPoint.x) / currentPointRadius);
  58. if (currentPoint.y > _centerPoint.y) {
  59. curentPointAngle = 2 * M_PI - curentPointAngle;
  60. }
  61. //2.变化的角度
  62. CGFloat angle = _lastPointAngle - curentPointAngle;
  63. // 小点点的位置
  64. self.controlSpeedView.transform = CGAffineTransformRotate(self.controlSpeedView.transform, angle);
  65. _lastPointAngle = curentPointAngle;
  66. if (angle > 0) {
  67. if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) {
  68. [self.delegate changeSpeedWithIsAdd:YES speed:MIN(1, MAX(angle *2, 1))];
  69. }
  70. }else {
  71. if (self.delegate && [self.delegate respondsToSelector:@selector(changeSpeedWithIsAdd:speed:)]) {
  72. [self.delegate changeSpeedWithIsAdd:NO speed:MIN(1, MAX(angle *2, 1))];
  73. }
  74. }
  75. }
  76. - (void)setSpeed:(int)speed {
  77. _speed = speed;
  78. self.speedLabel.text = [NSString stringWithFormat:@"%d", speed];
  79. }
  80. - (void)setCurrentType:(KSWidgeMetronomeType)currentType {
  81. _currentType = currentType;
  82. switch (currentType) {
  83. case KSWidgeMetronomeType1V2:
  84. case KSWidgeMetronomeType2V2:
  85. {
  86. [self.nodeImage setImage:[UIImage imageNamed:@"half_node"]];
  87. }
  88. break;
  89. case KSWidgeMetronomeType1V4:
  90. case KSWidgeMetronomeType2V4:
  91. case KSWidgeMetronomeType3V4:
  92. case KSWidgeMetronomeType4V4:
  93. {
  94. [self.nodeImage setImage:[UIImage imageNamed:@"quarter_node"]];
  95. }
  96. break;
  97. case KSWidgeMetronomeType3V8:
  98. case KSWidgeMetronomeType6V8:
  99. {
  100. [self.nodeImage setImage:[UIImage imageNamed:@"eighth_node"]];
  101. }
  102. break;
  103. default:
  104. break;
  105. }
  106. }
  107. /*
  108. // Only override drawRect: if you perform custom drawing.
  109. // An empty implementation adversely affects performance during animation.
  110. - (void)drawRect:(CGRect)rect {
  111. // Drawing code
  112. }
  113. */
  114. @end