// // YMDynamicDetailInfoAlbumCell.m // MSYOUPAI // // Created by YoMi on 2024/3/21. // Copyright © 2024 MS. All rights reserved. // #import "YMDynamicDetailInfoAlbumCell.h" #import "YMDynamicDetailInfoAlbumCellViewModel.h" #import @interface YMDynamicDetailInfoAlbumCell() /// ViewModel @property (nonatomic, strong) YMDynamicDetailInfoAlbumCellViewModel *viewModel; /// 基础视图 @property (nonatomic, strong) UIView *baseView; /// 相册图片视图 @property (nonatomic, strong) UIImageView *albumImageView; @end @implementation YMDynamicDetailInfoAlbumCell - (void)ym_setupViews{ self.contentView.backgroundColor = UIColor.clearColor; self.backgroundColor = UIColor.clearColor; [self.contentView addSubview:self.baseView]; [self.baseView addSubview:self.albumImageView]; [self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded]; } - (void)updateConstraints{ [self.baseView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.contentView); make.left.equalTo(self.contentView); make.right.equalTo(self.contentView); make.bottom.equalTo(self.contentView); }]; [self.albumImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.baseView); make.left.equalTo(self.baseView); make.right.equalTo(self.baseView); make.bottom.equalTo(self.baseView); }]; [super updateConstraints]; } - (void)ym_bindViewModel:(YMDynamicDetailInfoAlbumCellViewModel *)viewModel{ if (!viewModel) { return; } _viewModel = viewModel; if ([self.viewModel.albumType isEqualToString:@"mp4"]) { [self getVideoPreViewImageURL:[LCTools getImageUrlWithAddress:self.viewModel.albumUrl].absoluteString withImageView:self.albumImageView]; } else { [self.albumImageView sd_setImageWithURL:[[LCTools getImageUrlWithAddress:self.viewModel.albumUrl] urlWithImageScale:50]]; } } - (UIView *)baseView{ if (!_baseView) { _baseView = [[UIView alloc]init]; } return _baseView; } - (UIImageView *)albumImageView{ if (!_albumImageView) { _albumImageView = [[UIImageView alloc]init]; _albumImageView.contentMode = UIViewContentModeScaleAspectFill; _albumImageView.clipsToBounds = YES; _albumImageView.layer.cornerRadius = adapt(10); _albumImageView.layer.masksToBounds = YES; } return _albumImageView; } // 判断是否有视频第一帧缓存 - (void)getVideoPreViewImageURL:(NSString *)videoURL withImageView:(UIImageView *)imageView { [[SDImageCache sharedImageCache] queryCacheOperationForKey:videoURL done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) { if (image) { imageView.image = image; } else { [self getVideoFirstViewImage:videoURL withImageView:imageView]; } }]; } // 获取视频第一帧并缓存 - (void)getVideoFirstViewImage:(NSString *)videoURL withImageView:(UIImageView *)imageView { imageView.image = nil; __block UIImage *videoImage; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSMutableDictionary * headers = [NSMutableDictionary dictionary]; AVAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:videoURL] options:@{@"AVURLAssetHTTPHeaderFieldsKey": headers}]; AVAssetImageGenerator *assetGen = [[AVAssetImageGenerator alloc] initWithAsset:asset]; assetGen.appliesPreferredTrackTransform = YES; CMTime time = CMTimeMakeWithSeconds(0.0, 600); NSError *error = nil; CMTime actualTime; CGImageRef image = [assetGen copyCGImageAtTime:time actualTime:&actualTime error:&error]; videoImage = [[UIImage alloc] initWithCGImage:image]; CGImageRelease(image); dispatch_async(dispatch_get_main_queue(), ^{ // 主线程更新UI imageView.image = videoImage; // 缓存图片 [[SDImageCache sharedImageCache] storeImage:videoImage forKey:videoURL completion:nil]; }); }); } @end