YMPersonalPageDynamicCell.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. //
  2. // YMPersonalPageDynamicCell.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2024/3/3.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMPersonalPageDynamicCell.h"
  9. #import "YMPersonalPageDynamicCellViewModel.h"
  10. @interface YMPersonalPageDynamicCell()
  11. /// ViewModel
  12. @property (nonatomic, strong) YMPersonalPageDynamicCellViewModel *viewModel;
  13. /// 基础视图
  14. @property (nonatomic, strong) UIView *baseView;
  15. /// 动态图片视图
  16. @property (nonatomic, strong) UIImageView *dynamicCoverView;
  17. @end
  18. @implementation YMPersonalPageDynamicCell
  19. - (void)ym_setupViews{
  20. [self.contentView addSubview:self.baseView];
  21. [self.baseView addSubview:self.dynamicCoverView];
  22. [self setNeedsUpdateConstraints];
  23. [self updateConstraintsIfNeeded];
  24. }
  25. - (void)updateConstraints {
  26. [self.baseView mas_makeConstraints:^(MASConstraintMaker *make) {
  27. make.top.equalTo(self.contentView);
  28. make.left.equalTo(self.contentView);
  29. make.right.equalTo(self.contentView);
  30. make.bottom.equalTo(self.contentView);
  31. }];
  32. [self.dynamicCoverView mas_makeConstraints:^(MASConstraintMaker *make) {
  33. make.top.equalTo(self.baseView);
  34. make.left.equalTo(self.baseView);
  35. make.right.equalTo(self.baseView);
  36. make.bottom.equalTo(self.baseView);
  37. }];
  38. [super updateConstraints];
  39. }
  40. - (void)ym_bindViewModel:(YMPersonalPageDynamicCellViewModel*)viewModel{
  41. if (!viewModel) {
  42. return;
  43. }
  44. _viewModel = viewModel;
  45. if([viewModel.dynamicCoverUrl rangeOfString:@"mp4"].location != NSNotFound){
  46. NSURL *url = [LCTools getImageUrlWithAddress:viewModel.dynamicCoverUrl];
  47. if(url){
  48. [self videoImageWithvideoURL:url completion:^(UIImage *image) {
  49. // 主线程执行:
  50. dispatch_async(dispatch_get_main_queue(), ^{
  51. [self.dynamicCoverView setImage:image];
  52. });
  53. }];
  54. }
  55. }else{
  56. [self.dynamicCoverView sd_setImageWithURL:[LCTools getImageUrlWithAddress:viewModel.dynamicCoverUrl]];
  57. }
  58. }
  59. - (UIView *)baseView{
  60. if (!_baseView) {
  61. _baseView = [[UIView alloc]init];
  62. _baseView.clipsToBounds = YES;
  63. _baseView.layer.cornerRadius = adapt(8);
  64. }
  65. return _baseView;
  66. }
  67. - (UIImageView *)dynamicCoverView{
  68. if (!_dynamicCoverView) {
  69. _dynamicCoverView = [[UIImageView alloc]init];
  70. _dynamicCoverView.backgroundColor = UIColor.lightGrayColor;
  71. _dynamicCoverView.contentMode = UIViewContentModeScaleAspectFill;
  72. }
  73. return _dynamicCoverView;
  74. }
  75. //获取视频预览图,这里用到了SDImage的缓存图片功能:
  76. - (void)videoImageWithvideoURL:(NSURL *)videoURL completion:(void (^_Nullable)(UIImage *image))completionBlock{
  77. //先从缓存中找是否有图片
  78. SDImageCache *cache = [SDImageCache sharedImageCache];
  79. UIImage *memoryImage = [cache imageFromMemoryCacheForKey:videoURL.absoluteString];
  80. if(memoryImage) {
  81. completionBlock(memoryImage);
  82. return;
  83. }else{
  84. UIImage*diskImage = [cache imageFromDiskCacheForKey:videoURL.absoluteString];
  85. if(diskImage) {
  86. completionBlock(diskImage);
  87. return;
  88. }
  89. }
  90. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  91. AVURLAsset *asset = [[AVURLAsset alloc]initWithURL:videoURL options:nil];
  92. NSParameterAssert(asset);
  93. AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc]initWithAsset:asset];
  94. assetImageGenerator.appliesPreferredTrackTransform = YES;
  95. assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;//必须设置,否则时间对应不上
  96. assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;//必须设置,否则时间对应不上
  97. assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
  98. CGImageRef thumbnailImageRef = NULL;
  99. CFTimeInterval thumbnailImageTime = 1;
  100. NSError *thumbnailImageGenerationError =nil;
  101. thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMakeWithSeconds(thumbnailImageTime, 10) actualTime:NULL error:&thumbnailImageGenerationError];
  102. if(!thumbnailImageRef)
  103. NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);
  104. UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage:thumbnailImageRef] :nil;
  105. if(thumbnailImage){
  106. completionBlock(thumbnailImage);
  107. dispatch_async(dispatch_get_main_queue(), ^{
  108. SDImageCache *cache = [SDImageCache sharedImageCache];
  109. // [cache storeImageToMemory:thumbnailImage forKey:videoURL.absoluteString];
  110. [cache storeImage:thumbnailImage forKey:videoURL.absoluteString completion:^{
  111. }];
  112. });
  113. }
  114. });
  115. }
  116. @end