RQExerciseQuestionCell.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // RQExerciseQuestionCell.m
  3. // SDJK
  4. //
  5. // Created by 张嵘 on 2021/8/16.
  6. //
  7. #import "RQExerciseQuestionCell.h"
  8. @interface RQExerciseQuestionCell () <QMUIImagePreviewViewDelegate>
  9. @property (nonatomic, readwrite, strong) RQExerciseQuestionItemViewModel *viewModel;
  10. @property (weak, nonatomic) IBOutlet YYLabel *questionLabel;
  11. @property (weak, nonatomic) IBOutlet UIImageView *questionImageView;
  12. @property (nonatomic, readwrite, strong) QMUIImagePreviewViewController *imagePreviewViewController;
  13. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelHeight;
  14. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageViewHeight;
  15. @end
  16. @implementation RQExerciseQuestionCell
  17. #pragma mark - PublicMethods
  18. + (instancetype)cellWithTableView:(UITableView *)tableView {
  19. static NSString *ID = @"RQExerciseQuestionCell";
  20. RQExerciseQuestionCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  21. if (!cell) {
  22. cell = [self rq_viewFromXib];
  23. cell.selectionStyle = UITableViewCellSelectionStyleNone;
  24. }
  25. return cell;
  26. }
  27. - (void)dealloc {
  28. }
  29. - (void)bindViewModel:(RQExerciseQuestionItemViewModel *)viewModel {
  30. @weakify(self)
  31. _viewModel = viewModel;
  32. self.questionLabel.attributedText = viewModel.qusetionString;
  33. self.labelHeight.constant = viewModel.labelHeight;
  34. if (RQStringIsEmpty(viewModel.imageString)) {
  35. self.questionImageView.hidden = YES;
  36. } else {
  37. self.questionImageView.hidden = NO;
  38. self.imageViewHeight.constant = viewModel.imageHeight;
  39. self.questionImageView.qmui_smoothAnimation = YES;
  40. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  41. @strongify(self)
  42. [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) {
  43. @strongify(self)
  44. if ([url.path containsString:@".gif"] ) {
  45. image = [UIImage qmui_animatedImageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_viewModel.imageString]]];
  46. }
  47. //通知主线程刷新
  48. dispatch_async(dispatch_get_main_queue(), ^{
  49. @strongify(self)
  50. //回调或者说是通知主线程刷新
  51. self.questionImageView.image = image;
  52. });
  53. }];
  54. });
  55. // [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) {
  56. // @strongify(self)
  57. // if ([url.path containsString:@".gif"] ) {
  58. // image = [UIImage qmui_animatedImageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_viewModel.imageString]]];
  59. // }
  60. // dispatch_async(dispatch_get_main_queue(), ^{
  61. // self.questionImageView.image = image;
  62. // });
  63. // }];
  64. [self.questionImageView setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  65. @strongify(self)
  66. [RQControllerHelper.currentViewController presentViewController:self.imagePreviewViewController animated:YES completion:nil];
  67. }];
  68. }
  69. }
  70. #pragma mark - SystemMethods
  71. - (void)awakeFromNib {
  72. [super awakeFromNib];
  73. // Initialization code
  74. }
  75. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  76. [super setSelected:selected animated:animated];
  77. // Configure the view for the selected state
  78. }
  79. #pragma mark - LazyLoad
  80. - (QMUIImagePreviewViewController *)imagePreviewViewController {
  81. if (!_imagePreviewViewController) {
  82. _imagePreviewViewController = [[QMUIImagePreviewViewController alloc] init];
  83. _imagePreviewViewController.presentingStyle = QMUIImagePreviewViewControllerTransitioningStyleZoom;// 将 present 动画改为 zoom,也即从某个位置放大到屏幕中央。默认样式为 fade。
  84. _imagePreviewViewController.imagePreviewView.delegate = self;// 将内部的图片查看器 delegate 指向当前 viewController,以获取要查看的图片数据
  85. // 当需要在退出大图预览时做一些事情的时候,可配合 UIViewController (QMUI) 的 qmui_visibleStateDidChangeBlock 来实现。
  86. _imagePreviewViewController.qmui_visibleStateDidChangeBlock = ^(QMUIImagePreviewViewController *viewController, QMUIViewControllerVisibleState visibleState) {
  87. if (visibleState == QMUIViewControllerWillDisappear) {
  88. // NSInteger exitAtIndex = viewController.imagePreviewView.currentImageIndex;
  89. }
  90. };
  91. }
  92. return _imagePreviewViewController;
  93. }
  94. #pragma mark - <QMUIImagePreviewViewDelegate>
  95. - (NSUInteger)numberOfImagesInImagePreviewView:(QMUIImagePreviewView *)imagePreviewView {
  96. return 1;
  97. }
  98. - (void)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView renderZoomImageView:(QMUIZoomImageView *)zoomImageView atIndex:(NSUInteger)index {
  99. zoomImageView.reusedIdentifier = @(index);
  100. // 模拟异步加载的情况
  101. if (index == 2) {
  102. [zoomImageView showLoading];
  103. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  104. if ([zoomImageView.reusedIdentifier isEqual:@(index)]) {
  105. [zoomImageView hideEmptyView];
  106. zoomImageView.image = self.questionImageView.image;
  107. zoomImageView.contentMode = UIViewContentModeScaleAspectFill;
  108. zoomImageView.maximumZoomScale = 3.f;
  109. }
  110. });
  111. } else {
  112. zoomImageView.image = self.questionImageView.image;
  113. }
  114. }
  115. - (QMUIImagePreviewMediaType)imagePreviewView:(QMUIImagePreviewView *)imagePreviewView assetTypeAtIndex:(NSUInteger)index {
  116. return QMUIImagePreviewMediaTypeImage;
  117. }
  118. #pragma mark - <QMUIZoomImageViewDelegate>
  119. - (void)singleTouchInZoomingImageView:(QMUIZoomImageView *)zoomImageView location:(CGPoint)location {
  120. // 退出图片预览
  121. [RQControllerHelper.currentViewController dismissViewControllerAnimated:YES completion:^{
  122. }];
  123. }
  124. @end