TuningForkSettingView.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. //
  2. // TuningForkSettingView.m
  3. // KulexiuForStudent
  4. //
  5. // Created by 王智 on 2022/10/20.
  6. //
  7. #import "TuningForkSettingView.h"
  8. #import "UIView+Animation.h"
  9. @interface TuningForkSettingView ()<UIGestureRecognizerDelegate>
  10. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *containerWidth;
  11. @property (weak, nonatomic) IBOutlet UIView *containerView;
  12. @property (nonatomic, assign) NSInteger musicalScale;
  13. @property (weak, nonatomic) IBOutlet UILabel *frequenceLabel;
  14. @property (weak, nonatomic) IBOutlet UILabel *musicalScaleLabel;
  15. @property (weak, nonatomic) IBOutlet UIImageView *pitchCImage;
  16. @property (weak, nonatomic) IBOutlet UIImageView *pitchDImage;
  17. @property (weak, nonatomic) IBOutlet UIImageView *pitchEImage;
  18. @property (weak, nonatomic) IBOutlet UIImageView *pitchFImage;
  19. @property (weak, nonatomic) IBOutlet UIImageView *pitchGImage;
  20. @property (weak, nonatomic) IBOutlet UIImageView *pitchAImage;
  21. @property (weak, nonatomic) IBOutlet UIImageView *pitchBImage;
  22. @property (weak, nonatomic) IBOutlet UIImageView *pitchDhalfImage;
  23. @property (weak, nonatomic) IBOutlet UILabel *pitchDhalfLabel;
  24. @property (weak, nonatomic) IBOutlet UILabel *pitchDhalfDesc;
  25. @property (weak, nonatomic) IBOutlet UIImageView *pitchEhalfImage;
  26. @property (weak, nonatomic) IBOutlet UILabel *pitchEhalfLabel;
  27. @property (weak, nonatomic) IBOutlet UILabel *pitchEhalfDesc;
  28. @property (weak, nonatomic) IBOutlet UIImageView *pitchGhalfImage;
  29. @property (weak, nonatomic) IBOutlet UILabel *pitchGhalfLabel;
  30. @property (weak, nonatomic) IBOutlet UILabel *pitchGhalfDesc;
  31. @property (weak, nonatomic) IBOutlet UIImageView *pitchAhalfImage;
  32. @property (weak, nonatomic) IBOutlet UILabel *pitchAhalfLabel;
  33. @property (weak, nonatomic) IBOutlet UILabel *pitchAhalfDesc;
  34. @property (weak, nonatomic) IBOutlet UIImageView *pitchBhalfImage;
  35. @property (weak, nonatomic) IBOutlet UILabel *pitchBhalfLabel;
  36. @property (weak, nonatomic) IBOutlet UILabel *pitchBhalfDesc;
  37. @property (nonatomic, assign) NSInteger chooseIndex;
  38. @property (nonatomic, strong) NSMutableArray *imageArray;
  39. @property (nonatomic, strong) NSMutableArray *frequenceArray;
  40. @property (nonatomic, copy) ForkSettingCallback callback;
  41. @end
  42. @implementation TuningForkSettingView
  43. - (void)awakeFromNib {
  44. [super awakeFromNib];
  45. [self configDefaultSource];
  46. UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
  47. [self addGestureRecognizer:tapGes];
  48. tapGes.delegate = self;
  49. if (IS_IPAD) {
  50. self.containerWidth.constant = 320;
  51. }
  52. }
  53. - (void)tapGesture: (UITapGestureRecognizer *)tapGesture {
  54. if (self.callback) {
  55. // 获取频率
  56. NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  57. if (self.frequenceArray.count > index) {
  58. NSInteger frequence = [self.frequenceArray[index] integerValue];
  59. self.callback(frequence,YES);
  60. }
  61. }
  62. [self removeView];
  63. }
  64. -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
  65. if ([touch.view isDescendantOfView:self.containerView]) {
  66. return NO;
  67. }
  68. return YES;
  69. }
  70. - (void)forkSettingAction:(ForkSettingCallback)callback {
  71. if (callback) {
  72. self.callback = callback;
  73. }
  74. }
  75. - (void)showView {
  76. [[NSObject getKeyWindow] addSubview:self];
  77. [self setPopAnimation];
  78. // 和安卓保持一致,点开后不播放
  79. // if (self.callback) {
  80. // NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  81. // if (self.frequenceArray.count > index) {
  82. // NSInteger frequence = [self.frequenceArray[index] integerValue];
  83. // self.callback(frequence,NO);
  84. // }
  85. // }
  86. }
  87. - (void)removeView {
  88. [self removeFromSuperview];
  89. }
  90. - (void)configDefaultSource {
  91. self.A4Frequence = DEFALUT_A4FREQUENCE;
  92. self.musicalScale = 4;
  93. self.isFallingTone = YES;
  94. self.imageArray = [NSMutableArray arrayWithArray:@[self.pitchCImage,self.pitchDhalfImage,self.pitchDImage,self.pitchEhalfImage,self.pitchEImage,self.pitchFImage,self.pitchGhalfImage,self.pitchGImage,self.pitchAhalfImage,self.pitchAImage,self.pitchBhalfImage,self.pitchBImage]];
  95. self.chooseIndex = 9;
  96. self.frequenceArray = [NSMutableArray arrayWithArray:@[
  97. @16.35, @17.32, @18.35, @19.45, @20.60, @21.83, @23.12, @24.50, @25.96, @27.50, @29.14, @30.87, // 0
  98. @32.70, @34.65, @36.71, @38.89, @41.20, @43.65, @46.25, @49.00, @51.91, @55.00, @58.27, @61.74, // 1
  99. @65.41, @69.30, @73.42, @77.78, @82.41, @87.31, @92.50, @98.00, @103.8, @110.0, @116.5, @123.5, // 2
  100. @130.8, @138.6, @146.8, @155.6, @164.8, @174.6, @185.0, @196.0, @207.7, @220.0, @233.1, @246.9, // 3
  101. @261.6, @277.2, @293.7, @311.1, @329.6, @349.2, @370.0, @392.0, @415.3, @440.0, @466.2, @493.9, // 4
  102. @523.3, @554.4, @587.3, @622.3, @659.3, @698.5, @740.0, @784.0, @830.6, @880.0, @932.3, @987.8, // 5
  103. @1047, @1109, @1175, @1245, @1319, @1397, @1480, @1568, @1661, @1760, @1865, @1976, // 6
  104. @2093, @2217, @2349, @2489, @2637, @2794, @2960, @3136, @3322, @3520, @3729, @3951, // 7
  105. @4186, @4435, @4699, @4978, @5274, @5588, @5920, @6272, @6645, @7040, @7459, @7902 // 8
  106. ]];
  107. }
  108. + (instancetype)shareInstance {
  109. TuningForkSettingView *view = [[[NSBundle mainBundle] loadNibNamed:@"TuningForkSettingView" owner:nil options:nil] firstObject];
  110. return view;
  111. }
  112. - (void)setIsFallingTone:(BOOL)isFallingTone {
  113. _isFallingTone = isFallingTone;
  114. if (isFallingTone) {
  115. self.pitchDhalfLabel.text = @"D";
  116. self.pitchEhalfLabel.text = @"E";
  117. self.pitchGhalfLabel.text = @"G";
  118. self.pitchAhalfLabel.text = @"A";
  119. self.pitchBhalfLabel.text = @"B";
  120. self.pitchDhalfDesc.text = @"♭";
  121. self.pitchEhalfDesc.text = @"♭";
  122. self.pitchGhalfDesc.text = @"♭";
  123. self.pitchAhalfDesc.text = @"♭";
  124. self.pitchBhalfDesc.text = @"♭";
  125. }
  126. else {
  127. self.pitchDhalfLabel.text = @"C";
  128. self.pitchEhalfLabel.text = @"D";
  129. self.pitchGhalfLabel.text = @"F";
  130. self.pitchAhalfLabel.text = @"G";
  131. self.pitchBhalfLabel.text = @"A";
  132. self.pitchDhalfDesc.text = @"#";
  133. self.pitchEhalfDesc.text = @"#";
  134. self.pitchGhalfDesc.text = @"#";
  135. self.pitchAhalfDesc.text = @"#";
  136. self.pitchBhalfDesc.text = @"#";
  137. }
  138. }
  139. - (void)setA4Frequence:(NSInteger)A4Frequence {
  140. _A4Frequence = A4Frequence;
  141. self.frequenceLabel.text = [NSString stringWithFormat:@"A4=%zdHz",A4Frequence];
  142. }
  143. - (IBAction)pitchChooseAction:(UIButton *)sender {
  144. NSInteger index = sender.tag - 1000;
  145. if (self.chooseIndex == index) {
  146. return;
  147. }
  148. // 修改
  149. UIImageView *preChooseImage = self.imageArray[self.chooseIndex];
  150. [preChooseImage setImage:[UIImage imageNamed:@"fork_pitchUnChoosed"]];
  151. UIImageView *chooseImageView = self.imageArray[index];
  152. [chooseImageView setImage:[UIImage imageNamed:@"fork_pitchChoosed"]];
  153. self.chooseIndex = index;
  154. if (self.callback) {
  155. NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  156. if (self.frequenceArray.count > index) {
  157. CGFloat frequence = [self.frequenceArray[index] doubleValue];
  158. self.callback(frequence,NO);
  159. }
  160. }
  161. }
  162. - (void)setChooseIndex:(NSInteger)chooseIndex {
  163. _chooseIndex = chooseIndex;
  164. UIImageView *chooseImageView = self.imageArray[chooseIndex];
  165. [chooseImageView setImage:[UIImage imageNamed:@"fork_pitchChoosed"]];
  166. }
  167. // 音阶+
  168. - (IBAction)musicalScaleAdd:(id)sender {
  169. if (self.musicalScale >= 6) {
  170. return;
  171. }
  172. self.musicalScale++;
  173. if (self.callback) {
  174. // 获取频率
  175. NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  176. if (self.frequenceArray.count > index) {
  177. NSInteger frequence = [self.frequenceArray[index] integerValue];
  178. self.callback(frequence,NO);
  179. }
  180. }
  181. }
  182. // 音阶-
  183. - (IBAction)musicalScaleMinus:(id)sender {
  184. if (self.musicalScale <= 4) {
  185. return;
  186. }
  187. self.musicalScale--;
  188. if (self.callback) {
  189. // 获取频率
  190. NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  191. if (self.frequenceArray.count > index) {
  192. NSInteger frequence = [self.frequenceArray[index] integerValue];
  193. self.callback(frequence,NO);
  194. }
  195. }
  196. }
  197. // 设置保存
  198. - (IBAction)forkSettingSureAction:(id)sender {
  199. if (self.callback) {
  200. // 获取频率
  201. NSInteger index = self.musicalScale * 12 + self.chooseIndex;
  202. if (self.frequenceArray.count > index) {
  203. NSInteger frequence = [self.frequenceArray[index] integerValue];
  204. self.callback(frequence,YES);
  205. }
  206. }
  207. [self removeView];
  208. }
  209. // 设置音阶
  210. - (void)setMusicalScale:(NSInteger)musicalScale {
  211. _musicalScale = musicalScale;
  212. self.musicalScaleLabel.text = [NSString stringWithFormat:@"%zd",musicalScale];
  213. }
  214. /*
  215. // Only override drawRect: if you perform custom drawing.
  216. // An empty implementation adversely affects performance during animation.
  217. - (void)drawRect:(CGRect)rect {
  218. // Drawing code
  219. }
  220. */
  221. @end