RQExercisExplainCell.m 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // RQExercisExplainCell.m
  3. // SDJK
  4. //
  5. // Created by 张嵘 on 2022/7/2.
  6. //
  7. #import "RQExercisExplainCell.h"
  8. @interface RQExercisExplainCell ()
  9. @property (nonatomic, readwrite, strong) RQExercisExplainItemViewModel *viewModel;
  10. @property (weak, nonatomic) IBOutlet UILabel *errorRateLabel;
  11. @property (weak, nonatomic) IBOutlet UIButton *starOneBtn;
  12. @property (weak, nonatomic) IBOutlet UIButton *starTwoBtn;
  13. @property (weak, nonatomic) IBOutlet UIButton *starThreeBtn;
  14. @property (weak, nonatomic) IBOutlet UIButton *starFourBtn;
  15. @property (weak, nonatomic) IBOutlet UIButton *starFiveBtn;
  16. @property (weak, nonatomic) IBOutlet UIImageView *videoCoverImageView;
  17. @property (weak, nonatomic) IBOutlet YYLabel *explainLabel;
  18. @property (weak, nonatomic) IBOutlet UIView *videoView;
  19. @property (weak, nonatomic) IBOutlet UIView *textView;
  20. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewToTop;
  21. @property (weak, nonatomic) IBOutlet UIView *voiceView;
  22. @property (weak, nonatomic) IBOutlet YYAnimatedImageView *voiceImageView;
  23. @property (weak, nonatomic) IBOutlet UIButton *voiceBtn;
  24. @end
  25. @implementation RQExercisExplainCell
  26. #pragma mark - PublicMethods
  27. + (instancetype)cellWithTableView:(UITableView *)tableView {
  28. static NSString *ID = @"RQExercisExplainCell";
  29. RQExercisExplainCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  30. if (!cell) {
  31. cell = [self rq_viewFromXib];
  32. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  33. }
  34. return cell;
  35. }
  36. - (void)bindViewModel:(RQExercisExplainItemViewModel *)viewModel {
  37. @weakify(self)
  38. _viewModel = viewModel;
  39. _errorRateLabel.text = [NSString stringWithFormat:@"%.1f%%",viewModel.exerciseModel.error_rate * 100];
  40. switch (viewModel.exerciseModel.diff_degree) {
  41. case 0: {
  42. _starOneBtn.selected = NO;
  43. _starTwoBtn.selected = NO;
  44. _starThreeBtn.selected = NO;
  45. _starFourBtn.selected = NO;
  46. _starFiveBtn.selected = NO;
  47. break;
  48. }
  49. case 1: {
  50. _starOneBtn.selected = YES;
  51. _starTwoBtn.selected = NO;
  52. _starThreeBtn.selected = NO;
  53. _starFourBtn.selected = NO;
  54. _starFiveBtn.selected = NO;
  55. break;
  56. }
  57. case 2: {
  58. _starOneBtn.selected = YES;
  59. _starTwoBtn.selected = YES;
  60. _starThreeBtn.selected = NO;
  61. _starFourBtn.selected = NO;
  62. _starFiveBtn.selected = NO;
  63. break;
  64. }
  65. case 3: {
  66. _starOneBtn.selected = YES;
  67. _starTwoBtn.selected = YES;
  68. _starThreeBtn.selected = YES;
  69. _starFourBtn.selected = NO;
  70. _starFiveBtn.selected = NO;
  71. break;
  72. }
  73. case 4: {
  74. _starOneBtn.selected = YES;
  75. _starTwoBtn.selected = YES;
  76. _starThreeBtn.selected = YES;
  77. _starFourBtn.selected = YES;
  78. _starFiveBtn.selected = NO;
  79. break;
  80. }
  81. case 5: {
  82. _starOneBtn.selected = YES;
  83. _starTwoBtn.selected = YES;
  84. _starThreeBtn.selected = YES;
  85. _starFourBtn.selected = YES;
  86. _starFiveBtn.selected = YES;
  87. break;
  88. }
  89. default:
  90. break;
  91. }
  92. [_videoCoverImageView yy_setImageWithURL:[NSURL URLWithString:viewModel.explainModel.ydt_video_pic] placeholder:RQWebImagePlaceholder() options:RQWebImageOptionAutomatic completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
  93. }];
  94. _videoView.hidden = RQStringIsEmpty(self.viewModel.explainModel.short_video_url);
  95. _textView.hidden = RQStringIsEmpty(self.viewModel.exerciseModel.explain_js);
  96. _textViewToTop.priority = _videoView.hidden? UILayoutPriorityRequired : UILayoutPriorityDefaultHigh;
  97. _explainLabel.attributedText = viewModel.explainString;
  98. [_voiceView setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  99. @strongify(self)
  100. self.voiceBtn.selected = !self.voiceBtn.selected;
  101. }];
  102. [RACObserve(self.voiceBtn, selected) subscribeNext:^(id _Nullable x) {
  103. @strongify(self)
  104. if (self.voiceBtn.selected) {
  105. [RQ_MUSIC_MANAGER rq_resetStreamerWithURLString:self.viewModel.exerciseModel.explainjsmp3 DOUAudioStreamerStatusBlock:^(DOUAudioStreamerStatus status) {
  106. if (status == DOUAudioStreamerPlaying) {
  107. _voiceImageView.image = [UIImage qmui_animatedImageNamed:@"语音播放.gif"];
  108. } else if (status == DOUAudioStreamerFinished) {
  109. _voiceImageView.image = [UIImage qmui_animatedImageNamed:@"语音播放.gif"];
  110. _voiceBtn.selected = NO;
  111. } else {
  112. _voiceImageView.image = [UIImage imageNamed:@"未播放静止"];
  113. }
  114. }];
  115. } else {
  116. [RQ_MUSIC_MANAGER rq_cancelStreamer];
  117. _voiceImageView.image = [UIImage imageNamed:@"未播放静止"];
  118. }
  119. }];
  120. RAC(self.tryLookLabel, text) = [[RACObserve(RQ_USER_MANAGER, tryLookCount) takeUntil:self.rac_prepareForReuseSignal] map:^id _Nullable(id _Nullable value) {
  121. @strongify(self)
  122. if (RQ_USER_MANAGER.isVip > 0) {
  123. self.tryLookView.hidden = YES;
  124. self.tryLookCoverImageView.hidden = YES;
  125. self.tryLookBottomView.hidden = YES;
  126. self.tryLookBgImageView.hidden = YES;
  127. } else {
  128. self.tryLookBottomView.hidden = NO;
  129. self.tryLookBgImageView.hidden = NO;
  130. if (RQ_USER_MANAGER.tryLookCount == 0) {
  131. self.tryLookView.hidden = NO;
  132. self.tryLookCoverImageView.hidden = NO;
  133. } else {
  134. self.tryLookView.hidden = YES;
  135. self.tryLookCoverImageView.hidden = YES;
  136. }
  137. }
  138. return [NSString stringWithFormat:@"第%ld题",RQ_USER_MANAGER.tryLookCount];
  139. }];
  140. }
  141. #pragma mark - SystemMethods
  142. - (void)awakeFromNib {
  143. [super awakeFromNib];
  144. _openVipBtn.layer.cornerRadius = _openVipBtn.rq_height / 2.f;
  145. [_openVipBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  146. RQActivateVIPViewModel *activateVIPViewModel = [[RQActivateVIPViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:nil];
  147. [RQ_APPDELEGATE.services pushViewModel:activateVIPViewModel animated:YES];
  148. }];
  149. }
  150. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  151. [super setSelected:selected animated:animated];
  152. }
  153. @end