123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- //
- // RQExerciseQuestionCell.m
- // JSJP
- //
- // Created by 张嵘 on 2021/8/16.
- //
- #import "RQExerciseQuestionCell.h"
- #import <ZFPlayer/ZFAVPlayerManager.h>
- @interface RQExerciseQuestionCell () <QMUIImagePreviewViewDelegate>
- @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 - <QMUIImagePreviewViewDelegate>
- - (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 - <QMUIZoomImageViewDelegate>
- - (void)singleTouchInZoomingImageView:(QMUIZoomImageView *)zoomImageView location:(CGPoint)location {
- // 退出图片预览
- [RQControllerHelper.currentViewController dismissViewControllerAnimated:YES completion:nil];
- }
- @end
|