// // RQExerciseQuestionCell.m // JSJP // // Created by 张嵘 on 2021/8/16. // #import "RQExerciseQuestionCell.h" #import @interface RQExerciseQuestionCell () @property (nonatomic, readwrite, strong) RQExerciseQuestionItemViewModel *viewModel; @property (weak, nonatomic) IBOutlet YYLabel *questionLabel; @property (weak, nonatomic) IBOutlet UIImageView *questionImageView; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelHeight; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageViewHeight; @property (nonatomic, readwrite, strong) ZFPlayerController *zfPlayer; @property (nonatomic, readwrite, strong) QMUIImagePreviewViewController *imagePreviewViewController; @property (nonatomic, readwrite, strong) UIImage *subImage; @end @implementation RQExerciseQuestionCell #pragma mark - PublicMethods + (instancetype)cellWithTableView:(UITableView *)tableView { static NSString *ID = @"RQExerciseQuestionCell"; RQExerciseQuestionCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) { cell = [self rq_viewFromXib]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } return cell; } - (void)dealloc { } - (void)bindViewModel:(RQExerciseQuestionItemViewModel *)viewModel { @weakify(self) _viewModel = viewModel; self.questionLabel.userInteractionEnabled = YES; RAC(self.questionLabel, attributedText) = [[RACObserve(viewModel, qusetionString) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread]; RAC(self.labelHeight, constant) = [[RACObserve(viewModel, labelHeight) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread]; RAC(self.questionImageView, hidden) = [[[RACSignal combineLatest:@[RACObserve(viewModel, imageString),RACObserve(viewModel, videoString)] reduce:^(NSString *imageString , NSString *videoString) { return @(RQStringIsEmpty(imageString) && RQStringIsEmpty(videoString)); }] takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread]; RAC(self.imageViewHeight, constant) = [[RACObserve(viewModel, imageHeight) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread]; RAC(self.questionImageView, image) = [[[RACObserve(viewModel, imageString) deliverOnMainThread] map:^id _Nullable(id _Nullable value) { if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.sinaImage) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image) { return viewModel.exerciseModel.ydtQuestionModel.sinaImage; } else { @strongify(self) __block UIImage *getImage; UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.questionImageView.frame]; [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) { getImage = [image qmui_imageResizedInLimitedSize:CGSizeMake(RQ_SCREEN_WIDTH, RQ_SCREEN_WIDTH * ((image.size.height / image.size.width) * 1.00)) resizingMode:QMUIImageResizingModeScaleAspectFill]; }]; return getImage; } }] takeUntil:self.rac_prepareForReuseSignal]; RAC(self, subImage) = [[RACObserve(self.questionImageView, image) takeUntil:self.rac_prepareForReuseSignal] deliverOnMainThread]; [self.questionImageView setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [[RACScheduler mainThreadScheduler] schedule:^{ @strongify(self) [RQControllerHelper.currentViewController presentViewController:self.imagePreviewViewController animated:YES completion:nil]; }]; }]; if (RQStringIsNotEmpty(viewModel.videoString)) { NSURL *moveUrl = [NSURL URLWithString:viewModel.exerciseModel.ydtQuestionModel.media_url]; if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video) { moveUrl = viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url; } self.zfPlayer = [[ZFPlayerController alloc] initWithPlayerManager:[[ZFAVPlayerManager alloc] init] containerView:self.questionImageView]; self.zfPlayer.assetURLs = @[moveUrl]; [self.zfPlayer playTheIndex:0]; /// 播放完成 self.zfPlayer.playerDidToEnd = ^(id _Nonnull asset) { @strongify(self) [self.zfPlayer playTheIndex:0]; }; } // if (RQStringIsNotEmpty(viewModel.imageString)) { // self.questionImageView.hidden = NO; // self.imageViewHeight.constant = viewModel.imageHeight; // self.questionImageView.qmui_smoothAnimation = YES; // if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.sinaImage) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image) { // self.subImage = viewModel.exerciseModel.ydtQuestionModel.sinaImage; // self.questionImageView.image = self.subImage; // } else { // [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) { // @strongify(self) // if ([url.path containsString:@".gif"] ) { // image = [UIImage qmui_animatedImageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_viewModel.imageString]]]; // } // dispatch_async(dispatch_get_main_queue(), ^{ // self.subImage = [image qmui_imageResizedInLimitedSize:CGSizeMake(RQ_SCREEN_WIDTH, RQ_SCREEN_WIDTH * ((image.size.height / image.size.width) * 1.00)) resizingMode:QMUIImageResizingModeScaleAspectFill]; // self.questionImageView.image = self.subImage; // }); // }]; // } // // [self.questionImageView setTapActionWithBlock:^(UITapGestureRecognizer *tap) { // @strongify(self) // [[RACScheduler mainThreadScheduler] schedule:^{ // [RQControllerHelper.currentViewController presentViewController:self.imagePreviewViewController animated:YES completion:nil]; // }]; // }]; // // RAC(self.questionImageView, userInteractionEnabled) = [[RACObserve(RQ_Exercise_Module, isScrolling) map:^id _Nullable(id _Nullable value) { // return @(!RQ_Exercise_Module.isScrolling); // }] takeUntil:self.rac_prepareForReuseSignal]; // } else { // if (RQStringIsNotEmpty(viewModel.videoString)) { // self.questionImageView.hidden = NO; // self.imageViewHeight.constant = viewModel.imageHeight; // NSURL *moveUrl = [NSURL URLWithString:viewModel.exerciseModel.ydtQuestionModel.media_url]; // if (!RQObjectIsNil(viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url) && !RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video) { // moveUrl = viewModel.exerciseModel.ydtQuestionModel.video_filePath_Url; // } // self.questionImageView.image = RQWebVideoImagePlaceholder(); // self.zfPlayer = [[ZFPlayerController alloc] initWithPlayerManager:[[ZFAVPlayerManager alloc] init] containerView:self.questionImageView]; // self.zfPlayer.assetURLs = @[moveUrl]; // [self.zfPlayer playTheIndex:0]; // /// 播放完成 // self.zfPlayer.playerDidToEnd = ^(id _Nonnull asset) { // @strongify(self) // [self.zfPlayer playTheIndex:0]; // }; // } else { // self.questionImageView.hidden = YES; // } // } } #pragma mark - SystemMethods - (void)awakeFromNib { [super awakeFromNib]; // Initialization code } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } #pragma mark - LazyLoad - (QMUIImagePreviewViewController *)imagePreviewViewController { @weakify(self) if (!_imagePreviewViewController) { _imagePreviewViewController = [[QMUIImagePreviewViewController alloc] init]; _imagePreviewViewController.presentingStyle = QMUIImagePreviewViewControllerTransitioningStyleZoom;// 将 present 动画改为 zoom,也即从某个位置放大到屏幕中央。默认样式为 fade。 _imagePreviewViewController.imagePreviewView.delegate = self;// 将内部的图片查看器 delegate 指向当前 viewController,以获取要查看的图片数据 // 当需要在退出大图预览时做一些事情的时候,可配合 UIViewController (QMUI) 的 qmui_visibleStateDidChangeBlock 来实现。 _imagePreviewViewController.qmui_visibleStateDidChangeBlock = ^(QMUIImagePreviewViewController *viewController, QMUIViewControllerVisibleState visibleState) { if (visibleState == QMUIViewControllerWillDisappear) { // NSInteger exitAtIndex = viewController.imagePreviewView.currentImageIndex; } }; self.imagePreviewViewController.sourceImageView = ^UIView *{ @strongify(self) return self.questionImageView; }; } return _imagePreviewViewController; } #pragma mark - - (NSUInteger)numberOfImagesInImagePreviewView:(QMUIImagePreviewView *)imagePreviewView { return 1; } - (void)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView renderZoomImageView:(QMUIZoomImageView *)zoomImageView atIndex:(NSUInteger)index { @weakify(self) zoomImageView.reusedIdentifier = @(index); // 模拟异步加载的情况 if (index == 2) { [zoomImageView showLoading]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ @strongify(self) if ([zoomImageView.reusedIdentifier isEqual:@(index)]) { [zoomImageView hideEmptyView]; zoomImageView.image = self.subImage; zoomImageView.contentMode = UIViewContentModeScaleAspectFill; zoomImageView.maximumZoomScale = 3.f; } }); } else { zoomImageView.image = self.subImage; } } - (QMUIImagePreviewMediaType)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView assetTypeAtIndex:(NSUInteger)index { return QMUIImagePreviewMediaTypeImage; } #pragma mark - - (void)singleTouchInZoomingImageView:(QMUIZoomImageView *)zoomImageView location:(CGPoint)location { // 退出图片预览 [RQControllerHelper.currentViewController dismissViewControllerAnimated:YES completion:nil]; } @end