WidgetViewController.m 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. //
  2. // WidgetViewController.m
  3. // KulexiuForStudent
  4. //
  5. // Created by 王智 on 2022/9/13.
  6. //
  7. #import "WidgetViewController.h"
  8. #import "WidgetNavView.h"
  9. #import "WidgetDotView.h"
  10. #import "WidgetSpeedView.h"
  11. #import "WidgetFunctionView.h"
  12. #import "KSChoosePicker.h"
  13. #import "WidgetBottomButtonView.h"
  14. #import <AVFoundation/AVFoundation.h>
  15. #import "KSMetronomePlayer.h"
  16. #import "MetronomeManager.h"
  17. @interface WidgetViewController ()<MetronomeControlViewDelegate,MetronomeFunctionDelegate,MetronomeManagerDelegate>
  18. @property (nonatomic, strong) WidgetNavView *navView;
  19. @property (nonatomic, strong) WidgetDotView *dotView;
  20. @property (nonatomic, strong) WidgetSpeedView *speedView;
  21. @property (nonatomic, strong) WidgetFunctionView *functionView;
  22. @property (nonatomic, assign) int speed;
  23. @property (nonatomic, assign) KSWidgeMetronomeType metronomeType;
  24. @property (nonatomic, strong) KSChoosePicker *pickerView;
  25. @property (nonatomic, strong) WidgetBottomButtonView *bottomView;
  26. @end
  27. @implementation WidgetViewController
  28. - (void)viewDidLoad {
  29. [super viewDidLoad];
  30. // Do any additional setup after loading the view.
  31. self.ks_prefersNavigationBarHidden = YES;
  32. [self configUI];
  33. }
  34. - (void)viewDidAppear:(BOOL)animated {
  35. [super viewDidAppear:animated];
  36. [self setDefaultConfig];
  37. }
  38. - (void)backAction {
  39. [self.navigationController popViewControllerAnimated:YES];
  40. }
  41. - (void)setDefaultConfig {
  42. _speed = METRONOME_MANAGER.speed;
  43. self.speedView.speed = self.speed;
  44. self.functionView.speed = self.speed;
  45. self.metronomeType = METRONOME_MANAGER.metronomeType;
  46. [self changeBeat];
  47. self.functionView.volumeRate = METRONOME_MANAGER.playVolume;
  48. METRONOME_MANAGER.delegate = self;
  49. self.bottomView.isPlay = METRONOME_MANAGER.isPlaying;
  50. }
  51. - (void)configUI {
  52. [self.scrollView removeFromSuperview];
  53. // 背景图
  54. UIImage *bgImage = [UIImage imageNamed:@"gadget_bg"];
  55. UIImageView *imageView = [[UIImageView alloc] initWithImage:bgImage];
  56. imageView.contentMode = UIViewContentModeRedraw;
  57. [self.view addSubview:imageView];
  58. [imageView mas_makeConstraints:^(MASConstraintMaker *make) {
  59. make.left.right.top.bottom.mas_equalTo(self.view);
  60. }];
  61. [self.view addSubview:self.navView];
  62. [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
  63. make.left.right.top.mas_equalTo(self.view);
  64. make.height.mas_equalTo(kNaviBarHeight);
  65. }];
  66. CGFloat topSpace = IS_IPAD ? 100 : 10;
  67. [self.view addSubview:self.dotView];
  68. [self.dotView mas_makeConstraints:^(MASConstraintMaker *make) {
  69. make.left.right.mas_equalTo(self.view);
  70. make.top.mas_equalTo(self.navView.mas_bottom).offset(topSpace);
  71. make.height.mas_equalTo(44);
  72. }];
  73. CGFloat speedViewHeight = [WidgetSpeedView getViewHeight];
  74. [self.view addSubview:self.speedView];
  75. [self.speedView mas_makeConstraints:^(MASConstraintMaker *make) {
  76. make.left.right.mas_equalTo(self.view);
  77. make.top.mas_equalTo(self.dotView.mas_bottom);
  78. make.height.mas_equalTo(speedViewHeight);
  79. }];
  80. [self.view addSubview:self.functionView];
  81. [self.functionView mas_makeConstraints:^(MASConstraintMaker *make) {
  82. make.left.right.mas_equalTo(self.view);
  83. make.top.mas_equalTo(self.speedView.mas_bottom);
  84. make.height.mas_equalTo(115);
  85. }];
  86. [self.view addSubview:self.bottomView];
  87. [self.bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
  88. make.left.right.mas_equalTo(self.view);
  89. make.top.mas_equalTo(self.functionView.mas_bottom).offset(10);
  90. make.height.mas_equalTo(60);
  91. }];
  92. }
  93. #pragma mark --- delegate
  94. - (void)volumeChange:(float)volume {
  95. METRONOME_MANAGER.playVolume = volume;
  96. }
  97. - (void)clickChangeBeat {
  98. [METRONOME_MANAGER beatChooseCallback:^(KSWidgeMetronomeType type) {
  99. [self stopBeat];
  100. self.metronomeType = type;
  101. [self changeBeat];
  102. }];
  103. }
  104. - (void)clickChangeSpeed:(int)speed {
  105. self.speed = speed;
  106. [self.speedView.slider resetInitially];
  107. // 更新UI
  108. [self updateSpeedUI];
  109. }
  110. - (void)modifySpeed:(int)speed {
  111. self.speed = speed;
  112. // 更新UI
  113. [self updateSpeedUI];
  114. }
  115. - (void)updateSpeedUI {
  116. self.speedView.speed = self.speed;
  117. self.functionView.speed = self.speed;
  118. METRONOME_MANAGER.speed = self.speed;
  119. [self stopBeat];
  120. }
  121. #pragma mark --- lazying
  122. - (WidgetNavView *)navView {
  123. if (!_navView) {
  124. _navView = [WidgetNavView shareInstance];
  125. MJWeakSelf;
  126. [_navView navBackAction:^{
  127. [weakSelf backAction];
  128. }];
  129. }
  130. return _navView;
  131. }
  132. - (WidgetDotView *)dotView {
  133. if (!_dotView) {
  134. _dotView = [WidgetDotView shareInstance];
  135. }
  136. return _dotView;
  137. }
  138. - (WidgetSpeedView *)speedView {
  139. if (!_speedView) {
  140. _speedView = [WidgetSpeedView shareInstance];
  141. _speedView.delegate = self;
  142. }
  143. return _speedView;
  144. }
  145. - (WidgetFunctionView *)functionView {
  146. if (!_functionView) {
  147. _functionView = [WidgetFunctionView shareInstance];
  148. _functionView.delegate = self;
  149. }
  150. return _functionView;
  151. }
  152. - (WidgetBottomButtonView *)bottomView {
  153. if (!_bottomView) {
  154. _bottomView = [WidgetBottomButtonView shareInstance];
  155. MJWeakSelf;
  156. [_bottomView metronomePlayCallback:^(BOOL isPlay) {
  157. if (isPlay) {
  158. [weakSelf playBeat];
  159. }
  160. else {
  161. [weakSelf stopBeat];
  162. }
  163. }];
  164. }
  165. return _bottomView;
  166. }
  167. - (void)playBeat {
  168. self.bottomView.isPlay = YES;
  169. [METRONOME_MANAGER startPlay];
  170. }
  171. - (void)stopBeat {
  172. self.bottomView.isPlay = NO;
  173. [METRONOME_MANAGER stopPlay];
  174. }
  175. - (void)changeBeat {
  176. [self.dotView updateSpotView:self.metronomeType];
  177. self.functionView.currentMetronomeType = self.metronomeType;
  178. self.speedView.currentType = self.metronomeType;
  179. }
  180. - (void)setSpeed:(int)speed {
  181. _speed = speed;
  182. [self stopBeat];
  183. }
  184. #pragma mark ---- delegate
  185. - (void)playInterruption {
  186. [self stopBeat];
  187. }
  188. - (void)updateSpotHightState:(int)currentNo {
  189. [self.dotView updateSpotViewHeightState:currentNo];
  190. }
  191. - (void)dealloc {
  192. NSLog(@"----dealloc ");
  193. }
  194. /*
  195. #pragma mark - Navigation
  196. // In a storyboard-based application, you will often want to do a little preparation before navigation
  197. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  198. // Get the new view controller using [segue destinationViewController].
  199. // Pass the selected object to the new view controller.
  200. }
  201. */
  202. @end