NYExerciseQuestionItemViewModel.m 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. //
  2. // NYExerciseQuestionItemViewModel.m
  3. // jiaPei
  4. //
  5. // Created by Ning.ge on 2024/10/31.
  6. // Copyright © 2024 JCZ. All rights reserved.
  7. //
  8. #import "NYExerciseQuestionItemViewModel.h"
  9. #import "payRequsestHandler.h"
  10. @interface NYExerciseQuestionItemViewModel ()
  11. @property (nonatomic, readwrite, strong) RQExerciseModel *exerciseModel;
  12. @property (nonatomic, readwrite, strong) YYLabel *yyLabel;
  13. @property (nonatomic, readwrite, strong) NSString *typeString;
  14. @property (nonatomic, readwrite, strong) NSString *newString;
  15. @property (nonatomic, readwrite, strong) NSMutableAttributedString *qusetionString;
  16. @property (nonatomic, readwrite, assign) CGFloat labelHeight;
  17. @property (nonatomic, readwrite, assign) CGFloat imageHeight;
  18. @property (nonatomic, readwrite, strong) NSString *imageString;
  19. @property (nonatomic, readwrite, strong) NSString *videoString;
  20. @property (nonatomic, readwrite, strong) NSMutableAttributedString *spaceAttachment;
  21. @property (nonatomic, readwrite, strong) QMUIButton *readBtn;
  22. @property (nonatomic,assign) int readCount;
  23. @end
  24. @implementation NYExerciseQuestionItemViewModel
  25. - (instancetype)initWithRQExerciseModel:(RQExerciseModel *)exerciseModel {
  26. if (self = [super init]) {
  27. @weakify(self)
  28. self.readCount = 0;
  29. self.exerciseModel = exerciseModel;
  30. dispatch_async(dispatch_get_main_queue(), ^{
  31. @strongify(self)
  32. self.qusetionString = [self dealQuestionStrWithRQExerciseModel:exerciseModel];
  33. self.labelHeight = [self getMessageHeightWithAttributedStr:self.qusetionString andLabel:self.yyLabel];
  34. });
  35. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.media_url)) {
  36. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg)) {
  37. self.imageString = exerciseModel.ydtQuestionModel.media_url;
  38. self.videoString = @"";
  39. } else if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.video_url)) {
  40. self.imageString = @"";
  41. self.videoString = exerciseModel.ydtQuestionModel.media_url;
  42. } else {
  43. self.imageString = @"";
  44. self.videoString = @"";
  45. }
  46. } else {
  47. self.imageString = @"";
  48. self.videoString = @"";
  49. }
  50. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg) || RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.media_url)) {
  51. if (!RQObjectIsNil(exerciseModel.ydtQuestionModel.media_content)) {
  52. NSString *imageStr = [exerciseModel.ydtQuestionModel.media_content base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
  53. UIImage *sinaImage = [UIImage sd_imageWithData:[NSData dataWithBase64EncodedString:imageStr] scale:1 firstFrameOnly:YES];
  54. exerciseModel.ydtQuestionModel.sinaImage = sinaImage;
  55. } else {
  56. NSString *media_name;
  57. if(RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg)){//不为空
  58. media_name = exerciseModel.ydtQuestionModel.sinaimg;
  59. self.imageString = exerciseModel.ydtQuestionModel.sinaimg;
  60. }else{
  61. if ([exerciseModel.ydtQuestionModel.media_url containsString:@"https://"]) {
  62. media_name = [exerciseModel.ydtQuestionModel.media_url componentsSeparatedByString:@"/"].lastObject;
  63. }
  64. }
  65. NSData *mediaData = [RQ_YDTQuestion_Module getMediaDataWithMediaName:media_name];
  66. if (mediaData) {
  67. NSString *imageStr = [mediaData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
  68. UIImage *sinaImage = [UIImage sd_imageWithData:[NSData dataWithBase64EncodedString:imageStr] scale:1 firstFrameOnly:YES];
  69. exerciseModel.ydtQuestionModel.sinaImage = sinaImage;
  70. }
  71. }
  72. } else if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.video_url) && RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.media_url)) {
  73. NSString *media_name;
  74. if ([exerciseModel.ydtQuestionModel.video_url containsString:@"https://"]) {
  75. media_name = [exerciseModel.ydtQuestionModel.video_url componentsSeparatedByString:@"/"].lastObject;
  76. } else {
  77. media_name = exerciseModel.ydtQuestionModel.video_url;
  78. }
  79. NSURL *video_filePath_Url;
  80. if (!RQObjectIsNil(exerciseModel.ydtQuestionModel.media_content) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video) {
  81. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  82. NSString *documentsDirectory = [paths objectAtIndex:0];
  83. NSString *path = [documentsDirectory stringByAppendingPathComponent:media_name];
  84. [[NSFileManager defaultManager] createFileAtPath:path contents:exerciseModel.ydtQuestionModel.media_content attributes:nil];
  85. video_filePath_Url = [NSURL fileURLWithPath:path];
  86. }
  87. exerciseModel.ydtQuestionModel.video_filePath_Url = video_filePath_Url;
  88. }
  89. self.imageHeight = 0;
  90. self.rowHeight = 16.f + self.labelHeight + ((self.imageHeight == 0)? 0 : (16.f + self.imageHeight)) + 16.f;
  91. [[[RACObserve(RQ_Exercise_Module, exerciseFontSize) takeUntil:self.rac_willDeallocSignal] deliverOnMainThread] subscribeNext:^(id _Nullable x) {
  92. @strongify(self)
  93. self.qusetionString = [self dealQuestionStrWithRQExerciseModel:exerciseModel];
  94. self.labelHeight = [self getMessageHeightWithAttributedStr:self.qusetionString andLabel:self.yyLabel];
  95. }];
  96. RAC(self, rowHeight) = [[RACSignal combineLatest:@[[RACObserve(RQ_Exercise_Module, exerciseFontSize) takeUntil:self.rac_willDeallocSignal],[RACObserve(self, imageHeight) takeUntil:self.rac_willDeallocSignal],[RACObserve(self, labelHeight) takeUntil:self.rac_willDeallocSignal]] reduce:^(NSNumber *exerciseFontSize, NSNumber *imageHeight, NSNumber *labelHeight) {
  97. return @(16.f + labelHeight.floatValue + ((imageHeight.floatValue == 0)? 0 : (16.f + imageHeight.floatValue)) + 16.f);
  98. }] deliverOnMainThread] ;
  99. }
  100. return self;
  101. }
  102. - (NSString *)newString {
  103. return @"";
  104. }
  105. - (NSMutableAttributedString *)dealQuestionStrWithRQExerciseModel:(RQExerciseModel *)exerciseModel {
  106. NSString *questionStr = [NSString stringWithFormat:@"%ld、%@",(long)exerciseModel.ydtQuestionModel.num + 1 ,exerciseModel.ydtQuestionModel.Question];
  107. NSMutableAttributedString *text = [NSMutableAttributedString new];
  108. NSMutableAttributedString *testText = [NSMutableAttributedString new];
  109. [testText appendAttributedString:self.spaceAttachment];
  110. NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:questionStr];
  111. attrString.yy_font = [UIFont systemFontOfSize:16];
  112. attrString.yy_color = RQ_MAIN_TEXT_COLOR_1;
  113. [testText appendAttributedString: attrString];
  114. [text appendAttributedString:testText];
  115. // [text appendAttributedString:[self padding]];
  116. text.yy_lineSpacing = 8;
  117. return text;
  118. }
  119. /**
  120. * 获取lb的高度
  121. * @param mess lb.text
  122. * @param lb (YYLabel *)label
  123. * @return lb的高度
  124. */
  125. - (CGFloat)getMessageHeight:(NSString *)mess andLabel:(YYLabel *)lb {
  126. NSMutableAttributedString *introText = [[NSMutableAttributedString alloc] initWithString:mess];
  127. introText.yy_font = [UIFont boldSystemFontOfSize:16];
  128. introText.yy_lineSpacing = 8;
  129. lb.attributedText = introText;
  130. CGSize introSize = CGSizeMake(RQ_SCREEN_WIDTH-131 -225 - (16 * 4)-40, CGFLOAT_MAX);
  131. YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:introSize text:introText];
  132. lb.textLayout = layout;
  133. CGFloat introHeight = layout.textBoundingSize.height;
  134. return introHeight;
  135. }
  136. - (CGFloat)getMessageHeightWithAttributedStr:(NSMutableAttributedString *)attributedStr andLabel:(YYLabel *)lb {
  137. lb.attributedText = attributedStr;
  138. CGSize introSize = CGSizeMake(RQ_SCREEN_WIDTH-131 -225 - (16 * 4)-40, CGFLOAT_MAX);
  139. YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:introSize text:attributedStr];
  140. lb.textLayout = layout;
  141. CGFloat introHeight = layout.textBoundingSize.height;
  142. return introHeight;
  143. }
  144. - (YYLabel *)yyLabel {
  145. if (!_yyLabel) {
  146. _yyLabel = [[YYLabel alloc] init];
  147. }
  148. return _yyLabel;
  149. }
  150. - (NSMutableAttributedString *)spaceAttachment {
  151. if (!_spaceAttachment) {
  152. UIView *spaceView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 25)];
  153. _spaceAttachment = [NSMutableAttributedString yy_attachmentStringWithContent:spaceView contentMode:UIViewContentModeCenter attachmentSize:CGSizeMake(4, 25) alignToFont:[UIFont boldSystemFontOfSize:16] alignment:YYTextVerticalAlignmentCenter];
  154. }
  155. return _spaceAttachment;
  156. }
  157. - (NSString *)itemClassName {
  158. return @"NYExerciseQuestionCell";
  159. }
  160. @end