YMPersonalDynamicAlbumCell.m 5.1 KB

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