YMDynamicDetailInfoAlbumCell.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // YMDynamicDetailInfoAlbumCell.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2024/3/21.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMDynamicDetailInfoAlbumCell.h"
  9. #import "YMDynamicDetailInfoAlbumCellViewModel.h"
  10. #import <ImageIO/ImageIO.h>
  11. @interface YMDynamicDetailInfoAlbumCell()
  12. /// ViewModel
  13. @property (nonatomic, strong) YMDynamicDetailInfoAlbumCellViewModel *viewModel;
  14. /// 基础视图
  15. @property (nonatomic, strong) UIView *baseView;
  16. /// 相册图片视图
  17. @property (nonatomic, strong) UIImageView *albumImageView;
  18. @end
  19. @implementation YMDynamicDetailInfoAlbumCell
  20. - (void)ym_setupViews{
  21. self.contentView.backgroundColor = UIColor.clearColor;
  22. self.backgroundColor = UIColor.clearColor;
  23. [self.contentView addSubview:self.baseView];
  24. [self.baseView addSubview:self.albumImageView];
  25. [self setNeedsUpdateConstraints];
  26. [self updateConstraintsIfNeeded];
  27. }
  28. - (void)updateConstraints{
  29. [self.baseView mas_makeConstraints:^(MASConstraintMaker *make) {
  30. make.top.equalTo(self.contentView);
  31. make.left.equalTo(self.contentView);
  32. make.right.equalTo(self.contentView);
  33. make.bottom.equalTo(self.contentView);
  34. }];
  35. [self.albumImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  36. make.top.equalTo(self.baseView);
  37. make.left.equalTo(self.baseView);
  38. make.right.equalTo(self.baseView);
  39. make.bottom.equalTo(self.baseView);
  40. }];
  41. [super updateConstraints];
  42. }
  43. - (void)ym_bindViewModel:(YMDynamicDetailInfoAlbumCellViewModel *)viewModel{
  44. if (!viewModel) {
  45. return;
  46. }
  47. _viewModel = viewModel;
  48. if ([self.viewModel.albumType isEqualToString:@"mp4"]) {
  49. [self getVideoPreViewImageURL:[LCTools getImageUrlWithAddress:self.viewModel.albumUrl].absoluteString withImageView:self.albumImageView];
  50. } else {
  51. [self.albumImageView sd_setImageWithURL:[[LCTools getImageUrlWithAddress:self.viewModel.albumUrl] urlWithImageScale:50]];
  52. }
  53. }
  54. - (UIView *)baseView{
  55. if (!_baseView) {
  56. _baseView = [[UIView alloc]init];
  57. }
  58. return _baseView;
  59. }
  60. - (UIImageView *)albumImageView{
  61. if (!_albumImageView) {
  62. _albumImageView = [[UIImageView alloc]init];
  63. _albumImageView.contentMode = UIViewContentModeScaleAspectFill;
  64. _albumImageView.clipsToBounds = YES;
  65. _albumImageView.layer.cornerRadius = adapt(10);
  66. _albumImageView.layer.masksToBounds = YES;
  67. }
  68. return _albumImageView;
  69. }
  70. // 判断是否有视频第一帧缓存
  71. - (void)getVideoPreViewImageURL:(NSString *)videoURL withImageView:(UIImageView *)imageView {
  72. [[SDImageCache sharedImageCache] queryCacheOperationForKey:videoURL done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
  73. if (image) {
  74. imageView.image = image;
  75. } else {
  76. [self getVideoFirstViewImage:videoURL withImageView:imageView];
  77. }
  78. }];
  79. }
  80. // 获取视频第一帧并缓存
  81. - (void)getVideoFirstViewImage:(NSString *)videoURL withImageView:(UIImageView *)imageView {
  82. imageView.image = nil;
  83. __block UIImage *videoImage;
  84. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  85. NSMutableDictionary * headers = [NSMutableDictionary dictionary];
  86. AVAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:videoURL] options:@{@"AVURLAssetHTTPHeaderFieldsKey": headers}];
  87. AVAssetImageGenerator *assetGen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
  88. assetGen.appliesPreferredTrackTransform = YES;
  89. CMTime time = CMTimeMakeWithSeconds(0.0, 600);
  90. NSError *error = nil;
  91. CMTime actualTime;
  92. CGImageRef image = [assetGen copyCGImageAtTime:time actualTime:&actualTime error:&error];
  93. videoImage = [[UIImage alloc] initWithCGImage:image];
  94. CGImageRelease(image);
  95. dispatch_async(dispatch_get_main_queue(), ^{
  96. // 主线程更新UI
  97. imageView.image = videoImage;
  98. // 缓存图片
  99. [[SDImageCache sharedImageCache] storeImage:videoImage forKey:videoURL completion:nil];
  100. });
  101. });
  102. }
  103. @end