ClassroomCoursewarePlayView.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. //
  2. // ClassroomCoursewarePlayView.m
  3. // KulexiuForTeacher
  4. //
  5. // Created by 王智 on 2022/11/17.
  6. //
  7. #import "ClassroomCoursewarePlayView.h"
  8. #import "KSWareSliderView.h"
  9. @interface ClassroomCoursewarePlayView ()<KSWareSliderDelegate>
  10. @property (weak, nonatomic) IBOutlet UILabel *musicNameLabel;
  11. @property (weak, nonatomic) IBOutlet UILabel *statusLabel;
  12. @property (weak, nonatomic) IBOutlet UIImageView *closeImageView;
  13. @property (weak, nonatomic) IBOutlet UILabel *timeLabel;
  14. @property (weak, nonatomic) IBOutlet UISlider *playProgress;
  15. @property (weak, nonatomic) IBOutlet UIButton *volumeButton;
  16. @property (weak, nonatomic) IBOutlet UIView *headView;
  17. @property (weak, nonatomic) IBOutlet UIView *fullView;
  18. @property (weak, nonatomic) IBOutlet UIView *fullContainer;
  19. @property (nonatomic, copy) CoursewarePlayerCallback callback;
  20. @property (weak, nonatomic) IBOutlet UIButton *playButton;
  21. @property (nonatomic, assign) NSInteger musicVolume;
  22. @property (weak, nonatomic) IBOutlet UIImageView *pickUpImage;
  23. @property (weak, nonatomic) IBOutlet UILabel *pickUpTitle;
  24. @property (nonatomic, strong) KSWareSliderView *volumeSlider;
  25. @property (nonatomic, assign) BOOL isShowSlider;
  26. @property (weak, nonatomic) IBOutlet UIView *sliderBgView;
  27. @property (nonatomic, assign) CGRect currentFrame;
  28. @end
  29. @implementation ClassroomCoursewarePlayView
  30. - (void)awakeFromNib {
  31. [super awakeFromNib];
  32. CGFloat width = 0.0f;
  33. CGFloat height = 0.0f;
  34. height = KLandscapeWidth / 4.0f * 3;
  35. if (height > KLandscapeHeight) {
  36. height = KLandscapeHeight;
  37. }
  38. width = height / 3.0f * 4;
  39. CGRect frame = CGRectMake((KLandscapeWidth - width) / 2.0f, 0, width, height);
  40. self.currentFrame = frame;
  41. CAGradientLayer *headLayer = [self createGradientLayerFromColor:HexRGB(0xFFEBD3) startPoint:CGPointMake(0.5, 0) endColor:HexRGB(0xFFD5AA) endPoint:CGPointMake(0.5, 1) bounds:CGRectMake(0, 0, CGRectGetWidth(frame), 34)];
  42. headLayer.masksToBounds = YES;
  43. [self.headView.layer addSublayer:headLayer];
  44. self.headView.hidden = NO;
  45. CAGradientLayer *fullLayer = [self createGradientLayerFromColor:HexRGB(0xFFEBD3) startPoint:CGPointMake(0.5, 0) endColor:HexRGB(0xFFD5AA) endPoint:CGPointMake(0.5, 1) bounds:CGRectMake(0, 0, CGRectGetWidth(frame), 72)];
  46. headLayer.masksToBounds = YES;
  47. [self.fullView.layer addSublayer:fullLayer];
  48. self.fullView.hidden = YES;
  49. self.fullContainer.hidden = YES;
  50. self.musicVolume = 100;
  51. self.progress = 0;
  52. [self.playProgress setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateNormal];
  53. [self.playProgress setThumbImage:[UIImage imageNamed:@"wareSlider_image"] forState:UIControlStateFocused];
  54. [self addSubview:self.volumeSlider];
  55. self.volumeSlider.volumeValue = self.musicVolume;
  56. self.isShowSlider = NO;
  57. }
  58. + (instancetype)shareInstance {
  59. ClassroomCoursewarePlayView *view = [[[NSBundle mainBundle] loadNibNamed:@"ClassroomCoursewarePlayView" owner:nil options:nil] firstObject];
  60. return view;
  61. }
  62. - (void)coursewarePlayAction:(CoursewarePlayerCallback)callback {
  63. if (callback) {
  64. self.callback = callback;
  65. }
  66. }
  67. - (void)configWithImageName:(NSString *)imageName {
  68. self.musicNameLabel.text = [NSString returnNoNullStringWithString:imageName];
  69. self.playerStatus = COURSESWARESTATUS_LOADING;
  70. }
  71. - (void)showInView:(UIView *)displayView {
  72. self.isDisplay = YES;
  73. [displayView addSubview:self];
  74. }
  75. - (void)hideView {
  76. self.isDisplay = NO;
  77. self.isShowSlider = NO;
  78. [self removeFromSuperview];
  79. }
  80. - (void)setPlayerStatus:(COURSESWARESTATUS)playerStatus {
  81. _playerStatus = playerStatus;
  82. switch (playerStatus) {
  83. case COURSESWARESTATUS_LOADING:
  84. {
  85. self.statusLabel.text = @"正在加载…";
  86. self.headView.hidden = NO;
  87. self.fullView.hidden = YES;
  88. self.fullContainer.hidden = YES;
  89. }
  90. break;
  91. case COURSESWARESTATUS_FAILED:
  92. {
  93. self.statusLabel.text = @"重新加载";
  94. self.headView.hidden = NO;
  95. self.fullView.hidden = YES;
  96. self.fullContainer.hidden = YES;
  97. }
  98. break;
  99. case COURSESWARESTATUS_PAUSE:
  100. {
  101. self.statusLabel.text = @"暂停播放";
  102. self.headView.hidden = YES;
  103. self.fullView.hidden = NO;
  104. self.fullContainer.hidden = NO;
  105. [self.playButton setImage:[UIImage imageNamed:@"classroomPlayer_play"] forState:UIControlStateNormal];
  106. }
  107. break;
  108. case COURSESWARESTATUS_PLAYING:
  109. {
  110. self.statusLabel.text = @"正在播放";
  111. self.headView.hidden = YES;
  112. self.fullView.hidden = NO;
  113. self.fullContainer.hidden = NO;
  114. [self.playButton setImage:[UIImage imageNamed:@"classroomPlayer_pause"] forState:UIControlStateNormal];
  115. }
  116. break;
  117. default:
  118. break;
  119. }
  120. }
  121. - (CAGradientLayer *)createGradientLayerFromColor:(UIColor *)fromColor startPoint:(CGPoint)startPoint endColor:(UIColor *)endColor endPoint:(CGPoint)endPoint bounds:(CGRect)bounds {
  122. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  123. gradientLayer.colors = @[(__bridge id)fromColor.CGColor, (__bridge id)endColor.CGColor];
  124. gradientLayer.startPoint = startPoint;
  125. gradientLayer.endPoint = endPoint;
  126. gradientLayer.frame = bounds;
  127. gradientLayer.locations = @[@(0),@(1.0f)];
  128. return gradientLayer;
  129. }
  130. - (IBAction)playAction:(id)sender {
  131. if (self.playerStatus == COURSESWARESTATUS_PAUSE) {
  132. if (self.callback) {
  133. self.playerStatus = COURSESWARESTATUS_PLAYING;
  134. self.callback(COURSEPLAYERACTION_PLAY, self.musicVolume,0);
  135. }
  136. }
  137. else if (self.playerStatus == COURSESWARESTATUS_PLAYING) {
  138. if (self.callback) {
  139. self.playerStatus = COURSESWARESTATUS_PAUSE;
  140. self.callback(COURSEPLAYERACTION_PAUSE, self.musicVolume,0);
  141. }
  142. }
  143. }
  144. - (IBAction)closeAction:(id)sender {
  145. if (self.callback) {
  146. self.playerStatus = COURSESWARESTATUS_LOADING;
  147. self.callback(COURSEPLAYERACTION_CANCLE, self.musicVolume,0);
  148. }
  149. }
  150. - (IBAction)reloadAction:(id)sender {
  151. if (self.playerStatus == COURSESWARESTATUS_FAILED) {
  152. if (self.callback) {
  153. self.playerStatus = COURSESWARESTATUS_LOADING;
  154. self.callback(COURSEPLAYERACTION_RELOAD, self.musicVolume,0);
  155. }
  156. }
  157. else { // 收起
  158. if (self.callback) {
  159. self.callback(COURSEPLAYERACTION_HIDEVIEW, self.musicVolume,0);
  160. }
  161. [self hideView];
  162. }
  163. }
  164. - (void)setTotalMusicTime:(NSInteger)totalMusicTime {
  165. _totalMusicTime = totalMusicTime;
  166. self.timeLabel.text = [NSString stringWithFormat:@"00:00/%@",[self fullTimeDesc]];
  167. }
  168. - (void)setProgress:(float)progress {
  169. _progress = progress;
  170. [self.playProgress setValue:progress];
  171. [self displayTimeView];
  172. }
  173. - (NSString *)fullTimeDesc {
  174. NSInteger duration = self.totalMusicTime;
  175. NSString *timeDesc = @"00:00";
  176. if (duration / 60 > 0) {
  177. NSInteger secondTime = duration % 60;
  178. NSString *secondStr = @"";
  179. if (secondTime < 10) {
  180. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  181. } else {
  182. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  183. }
  184. timeDesc = [NSString stringWithFormat:@"%2ld:%@", duration / 60, secondStr];
  185. }
  186. else {
  187. NSInteger secondTime = duration % 60;
  188. NSString *secondStr = @"";
  189. if (secondTime < 10) {
  190. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  191. } else {
  192. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  193. }
  194. timeDesc = [NSString stringWithFormat:@"00:%@", secondStr];
  195. }
  196. return timeDesc;
  197. }
  198. - (void)displayTimeView {
  199. NSInteger duration = self.totalMusicTime;
  200. NSInteger currentDuration = duration * self.progress;
  201. NSString *timeDesc = @"00:00";
  202. if (currentDuration / 60 > 0) {
  203. NSInteger secondTime = currentDuration % 60;
  204. NSString *secondStr = @"";
  205. if (secondTime < 10) {
  206. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  207. } else {
  208. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  209. }
  210. timeDesc = [NSString stringWithFormat:@"%2ld:%@", currentDuration / 60, secondStr];
  211. }
  212. else {
  213. NSInteger secondTime = currentDuration % 60;
  214. NSString *secondStr = @"";
  215. if (secondTime < 10) {
  216. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  217. } else {
  218. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  219. }
  220. timeDesc = [NSString stringWithFormat:@"00:%@", secondStr];
  221. }
  222. self.timeLabel.text = [NSString stringWithFormat:@"%@/%@",timeDesc, [self fullTimeDesc]];
  223. }
  224. - (IBAction)progressValueChange:(UISlider *)sender {
  225. float progress = sender.value;
  226. if (self.callback) {
  227. self.callback(COURSEPLAYERACTION_CHANGEPROGRESS, self.musicVolume, progress);
  228. }
  229. }
  230. - (KSWareSliderView *)volumeSlider {
  231. if (!_volumeSlider) {
  232. _volumeSlider = [[KSWareSliderView alloc] initWithFrame:CGRectZero];
  233. _volumeSlider.delegate = self;
  234. _volumeSlider.backgroundColor = HexRGB(0xffffff);
  235. _volumeSlider.volumeValue = self.musicVolume;
  236. _volumeSlider.isVertical = YES;
  237. }
  238. return _volumeSlider;
  239. }
  240. - (IBAction)sliderDIsplay:(id)sender {
  241. self.isShowSlider = !_isShowSlider;
  242. }
  243. - (void)setIsShowSlider:(BOOL)isShowSlider {
  244. _isShowSlider = isShowSlider;
  245. if (isShowSlider) {
  246. [self.sliderBgView addSubview:self.volumeSlider];
  247. [self.volumeSlider mas_makeConstraints:^(MASConstraintMaker *make) {
  248. make.right.mas_equalTo(self.sliderBgView.mas_right).offset(-8);
  249. make.top.mas_equalTo(42);
  250. make.width.mas_equalTo(20);
  251. make.height.mas_equalTo(115);
  252. }];
  253. }
  254. else {
  255. [self.volumeSlider removeFromSuperview];
  256. }
  257. }
  258. #pragma mark ----- volumeSlider delegate
  259. - (void)volumeChangeAction:(NSInteger)volume {
  260. self.musicVolume = volume;
  261. if (self.callback) {
  262. self.callback(COURSEPLAYERACTION_VOLUME, self.musicVolume, 0);
  263. }
  264. }
  265. /*
  266. // Only override drawRect: if you perform custom drawing.
  267. // An empty implementation adversely affects performance during animation.
  268. - (void)drawRect:(CGRect)rect {
  269. // Drawing code
  270. }
  271. */
  272. @end