RQExerciseQuestionCell.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. //
  2. // RQExerciseQuestionCell.m
  3. // JSJP
  4. //
  5. // Created by 张嵘 on 2021/8/16.
  6. //
  7. #import "RQExerciseQuestionCell.h"
  8. #import <ZFPlayer/ZFAVPlayerManager.h>
  9. #import <SDWebImage/UIImageView+WebCache.h>
  10. @interface RQExerciseQuestionCell () <QMUIImagePreviewViewDelegate>
  11. @property (nonatomic, readwrite, strong) RQExerciseQuestionItemViewModel *viewModel;
  12. @property (weak, nonatomic) IBOutlet YYLabel *questionLabel;
  13. @property (weak, nonatomic) IBOutlet UIImageView *questionImageView;
  14. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelHeight;
  15. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageViewHeight;
  16. @property (nonatomic, readwrite, strong) ZFPlayerController *zfPlayer;
  17. @property (nonatomic, readwrite, strong) QMUIImagePreviewViewController *imagePreviewViewController;
  18. @property (nonatomic, readwrite, strong) UIImage *subImage;
  19. @end
  20. @implementation RQExerciseQuestionCell
  21. #pragma mark - PublicMethods
  22. + (instancetype)cellWithTableView:(UITableView *)tableView {
  23. static NSString *ID = @"RQExerciseQuestionCell";
  24. RQExerciseQuestionCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  25. if (!cell) {
  26. cell = [self rq_viewFromXib];
  27. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  28. }
  29. return cell;
  30. }
  31. - (void)dealloc {
  32. }
  33. - (void)bindViewModel:(RQExerciseQuestionItemViewModel *)viewModel {
  34. @weakify(self)
  35. _viewModel = viewModel;
  36. self.questionLabel.userInteractionEnabled = YES;
  37. RAC(self.questionLabel, attributedText) = [[RACObserve(viewModel, qusetionString) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread];
  38. RAC(self.labelHeight, constant) = [[RACObserve(viewModel, labelHeight) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread];
  39. RAC(self.questionImageView, hidden) = [[[RACSignal combineLatest:@[RACObserve(viewModel, imageString),RACObserve(viewModel, videoString)] reduce:^(NSString *imageString , NSString *videoString) {
  40. return @(RQStringIsEmpty(imageString) && RQStringIsEmpty(videoString));
  41. }] takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread];
  42. RAC(self.imageViewHeight, constant) = [[RACObserve(viewModel, imageHeight) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread];
  43. // RAC(self.questionImageView, image) = [[[RACObserve(viewModel, imageString) deliverOnMainThread] map:^id _Nullable(id _Nullable value) {
  44. // if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.sinaImage) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image) {
  45. // return viewModel.exerciseModel.ydtQuestionModel.sinaImage;
  46. // } else {
  47. // @strongify(self)
  48. // __block UIImage *getImage;
  49. // UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.questionImageView.frame];
  50. // [imageView yy_setImageWithURL:[NSURL URLWithString:viewModel.imageString] placeholder:RQWebImagePlaceholder() options:RQWebImageOptionAutomatic completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
  51. // getImage = [image qmui_imageResizedInLimitedSize:CGSizeMake(RQ_SCREEN_WIDTH, RQ_SCREEN_WIDTH * ((image.size.height / image.size.width) * 1.00)) resizingMode:QMUIImageResizingModeScaleAspectFill];
  52. // }];
  53. //
  54. // return getImage;
  55. // }
  56. // }] takeUntil:self.rac_prepareForReuseSignal];
  57. if([viewModel.imageString containsString:@".gif"]){
  58. NSLog(@"%@",viewModel.imageString);
  59. [self.questionImageView sd_setImageWithURL:[NSURL URLWithString:viewModel.imageString] placeholderImage:RQWebImagePlaceholder()];
  60. }else{
  61. [self.questionImageView yy_setImageWithURL:[NSURL URLWithString:viewModel.imageString] placeholder:RQWebImagePlaceholder()];
  62. }
  63. RAC(self, subImage) = [[RACObserve(self.questionImageView, image) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread];
  64. [self.questionImageView setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  65. [[RACScheduler mainThreadScheduler] schedule:^{
  66. @strongify(self)
  67. RQ_Exercise_Module.isShow_CatalogueView = YES;
  68. [RQControllerHelper.currentViewController presentViewController:self.imagePreviewViewController animated:YES completion:nil];
  69. }];
  70. }];
  71. if (RQStringIsNotEmpty(viewModel.videoString)) {
  72. NSURL *moveUrl = [NSURL URLWithString:viewModel.exerciseModel.ydtQuestionModel.media_url];
  73. if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video) {
  74. moveUrl = viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url;
  75. }
  76. self.zfPlayer = [[ZFPlayerController alloc] initWithPlayerManager:[[ZFAVPlayerManager alloc] init] containerView:self.questionImageView];
  77. self.zfPlayer.assetURLs = @[moveUrl];
  78. [self.zfPlayer playTheIndex:0];
  79. /// 播放完成
  80. self.zfPlayer.playerDidToEnd = ^(id _Nonnull asset) {
  81. @strongify(self)
  82. [self.zfPlayer playTheIndex:0];
  83. };
  84. }
  85. // if (RQStringIsNotEmpty(viewModel.imageString)) {
  86. // self.questionImageView.hidden = NO;
  87. // self.imageViewHeight.constant = viewModel.imageHeight;
  88. // self.questionImageView.qmui_smoothAnimation = YES;
  89. // if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.sinaImage) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image) {
  90. // self.subImage = viewModel.exerciseModel.ydtQuestionModel.sinaImage;
  91. // self.questionImageView.image = self.subImage;
  92. // } else {
  93. // [self.questionImageView yy_setImageWithURL:[NSURL URLWithString:viewModel.imageString] placeholder:RQWebImagePlaceholder() options:RQWebImageOptionAutomatic completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
  94. // @strongify(self)
  95. // if ([url.path containsString:@".gif"] ) {
  96. // image = [UIImage qmui_animatedImageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_viewModel.imageString]]];
  97. // }
  98. // dispatch_async(dispatch_get_main_queue(), ^{
  99. // self.subImage = [image qmui_imageResizedInLimitedSize:CGSizeMake(RQ_SCREEN_WIDTH, RQ_SCREEN_WIDTH * ((image.size.height / image.size.width) * 1.00)) resizingMode:QMUIImageResizingModeScaleAspectFill];
  100. // self.questionImageView.image = self.subImage;
  101. // });
  102. // }];
  103. // }
  104. //
  105. // [self.questionImageView setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  106. // @strongify(self)
  107. // [[RACScheduler mainThreadScheduler] schedule:^{
  108. // [RQControllerHelper.currentViewController presentViewController:self.imagePreviewViewController animated:YES completion:nil];
  109. // }];
  110. // }];
  111. //
  112. // RAC(self.questionImageView, userInteractionEnabled) = [[RACObserve(RQ_Exercise_Module, isScrolling) map:^id _Nullable(id _Nullable value) {
  113. // return @(!RQ_Exercise_Module.isScrolling);
  114. // }] takeUntil:self.rac_prepareForReuseSignal];
  115. // } else {
  116. // if (RQStringIsNotEmpty(viewModel.videoString)) {
  117. // self.questionImageView.hidden = NO;
  118. // self.imageViewHeight.constant = viewModel.imageHeight;
  119. // NSURL *moveUrl = [NSURL URLWithString:viewModel.exerciseModel.ydtQuestionModel.media_url];
  120. // if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video) {
  121. // moveUrl = viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url;
  122. // }
  123. // self.questionImageView.image = RQWebVideoImagePlaceholder();
  124. // self.zfPlayer = [[ZFPlayerController alloc] initWithPlayerManager:[[ZFAVPlayerManager alloc] init] containerView:self.questionImageView];
  125. // self.zfPlayer.assetURLs = @[moveUrl];
  126. // [self.zfPlayer playTheIndex:0];
  127. // /// 播放完成
  128. // self.zfPlayer.playerDidToEnd = ^(id _Nonnull asset) {
  129. // @strongify(self)
  130. // [self.zfPlayer playTheIndex:0];
  131. // };
  132. // } else {
  133. // self.questionImageView.hidden = YES;
  134. // }
  135. // }
  136. }
  137. #pragma mark - SystemMethods
  138. - (void)awakeFromNib {
  139. [super awakeFromNib];
  140. // Initialization code
  141. }
  142. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  143. [super setSelected:selected animated:animated];
  144. // Configure the view for the selected state
  145. }
  146. #pragma mark - LazyLoad
  147. - (QMUIImagePreviewViewController *)imagePreviewViewController {
  148. @weakify(self)
  149. if (!_imagePreviewViewController) {
  150. _imagePreviewViewController = [[QMUIImagePreviewViewController alloc] init];
  151. _imagePreviewViewController.presentingStyle = QMUIImagePreviewViewControllerTransitioningStyleZoom;// 将 present 动画改为 zoom,也即从某个位置放大到屏幕中央。默认样式为 fade。
  152. _imagePreviewViewController.imagePreviewView.delegate = self;// 将内部的图片查看器 delegate 指向当前 viewController,以获取要查看的图片数据
  153. // 当需要在退出大图预览时做一些事情的时候,可配合 UIViewController (QMUI) 的 qmui_visibleStateDidChangeBlock 来实现。
  154. _imagePreviewViewController.qmui_visibleStateDidChangeBlock = ^(QMUIImagePreviewViewController *viewController, QMUIViewControllerVisibleState visibleState) {
  155. if (visibleState == QMUIViewControllerWillDisappear) {
  156. RQ_Exercise_Module.isShow_CatalogueView = NO;
  157. // NSInteger exitAtIndex = viewController.imagePreviewView.currentImageIndex;
  158. }
  159. };
  160. self.imagePreviewViewController.sourceImageView = ^UIView *{
  161. @strongify(self)
  162. return self.questionImageView;
  163. };
  164. }
  165. return _imagePreviewViewController;
  166. }
  167. #pragma mark - <QMUIImagePreviewViewDelegate>
  168. - (NSUInteger)numberOfImagesInImagePreviewView:(QMUIImagePreviewView *)imagePreviewView {
  169. return 1;
  170. }
  171. - (void)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView renderZoomImageView:(QMUIZoomImageView *)zoomImageView atIndex:(NSUInteger)index {
  172. @weakify(self)
  173. zoomImageView.reusedIdentifier = @(index);
  174. // 模拟异步加载的情况
  175. if (index == 2) {
  176. [zoomImageView showLoading];
  177. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  178. @strongify(self)
  179. if ([zoomImageView.reusedIdentifier isEqual:@(index)]) {
  180. [zoomImageView hideEmptyView];
  181. zoomImageView.image = self.subImage;
  182. zoomImageView.contentMode = UIViewContentModeScaleAspectFill;
  183. zoomImageView.maximumZoomScale = 3.f;
  184. }
  185. });
  186. } else {
  187. zoomImageView.image = self.subImage;
  188. }
  189. }
  190. - (QMUIImagePreviewMediaType)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView assetTypeAtIndex:(NSUInteger)index {
  191. return QMUIImagePreviewMediaTypeImage;
  192. }
  193. #pragma mark - <QMUIZoomImageViewDelegate>
  194. - (void)singleTouchInZoomingImageView:(QMUIZoomImageView *)zoomImageView location:(CGPoint)location {
  195. // 退出图片预览
  196. [RQControllerHelper.currentViewController dismissViewControllerAnimated:YES completion:nil];
  197. }
  198. @end