Files
TIMSDK/iOS/TUIKit/TUIChat/Cell/CellData/Chat/TUIImageMessageCellData.m
T
2021-12-10 17:49:14 +08:00

273 lines
8.0 KiB
Objective-C

//
// TUIImageMessageCellData.m
// TXIMSDK_TUIKit_iOS
//
// Created by annidyfeng on 2019/5/21.
//
#import "TUIImageMessageCellData.h"
#import "TUIDefine.h"
#import "NSString+TUIUtil.h"
@implementation TUIImageItem
@end
@interface TUIImageMessageCellData ()
@property (nonatomic, assign) BOOL isDownloading;
@property (nonatomic, copy) TUIImageMessageDownloadCallback onFinish;
@end
@implementation TUIImageMessageCellData
+ (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
V2TIMImageElem *elem = message.imageElem;
TUIImageMessageCellData *imageData = [[TUIImageMessageCellData alloc] initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
imageData.path = [elem.path safePathString];
imageData.items = [NSMutableArray array];
for (V2TIMImage *item in elem.imageList) {
TUIImageItem *itemData = [[TUIImageItem alloc] init];
itemData.uuid = item.uuid;
itemData.size = CGSizeMake(item.width, item.height);
// itemData.url = item.url;
if(item.type == V2TIM_IMAGE_TYPE_THUMB){
itemData.type = TImage_Type_Thumb;
}
else if(item.type == V2TIM_IMAGE_TYPE_LARGE){
itemData.type = TImage_Type_Large;
}
else if(item.type == V2TIM_IMAGE_TYPE_ORIGIN){
itemData.type = TImage_Type_Origin;
}
[imageData.items addObject:itemData];
}
imageData.reuseId = TImageMessageCell_ReuseId;
return imageData;
}
+ (NSString *)getDisplayString:(V2TIMMessage *)message {
return TUIKitLocalizableString(TUIkitMessageTypeImage); // @"[图片]";
}
- (Class)getReplyQuoteViewDataClass
{
return NSClassFromString(@"TUIImageReplyQuoteViewData");
}
- (Class)getReplyQuoteViewClass
{
return NSClassFromString(@"TUIImageReplyQuoteView");
}
- (instancetype)initWithDirection:(TMsgDirection)direction {
self = [super initWithDirection:direction];
if (self) {
_uploadProgress = 100;
}
return self;
}
- (NSString *)getImagePath:(TUIImageType)type isExist:(BOOL *)isExist
{
NSString *path = nil;
BOOL isDir = NO;
*isExist = NO;
if(self.direction == MsgDirectionOutgoing) {
//上传方本地原图是否有效
path = [NSString stringWithFormat:@"%@%@", TUIKit_Image_Path, _path.lastPathComponent];
if([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]){
if(!isDir){
*isExist = YES;
}
}
}
if(!*isExist) {
//查看本地是否存在
TUIImageItem *tImageItem = [self getTImageItem:type];
path = [NSString stringWithFormat:@"%@%@", TUIKit_Image_Path, tImageItem.uuid];
if([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]){
if(!isDir){
*isExist = YES;
}
}
}
return path;
}
- (void)downloadImage:(TUIImageType)type finish:(TUIImageMessageDownloadCallback)finish
{
self.onFinish = finish;
[self downloadImage:type];
}
- (void)downloadImage:(TUIImageType)type
{
BOOL isExist = NO;
NSString *path = [self getImagePath:type isExist:&isExist];
if(isExist)
{
[self decodeImage:type];
return;
}
if(self.isDownloading) {
return;
}
self.isDownloading = YES;
//网络下载
V2TIMImage *imImage = [self getIMImage:type];
@weakify(self)
[imImage downloadImage:path progress:^(NSInteger curSize, NSInteger totalSize) {
@strongify(self)
[self updateProgress:curSize * 100 / totalSize withType:type];
} succ:^{
@strongify(self)
self.isDownloading = NO;
[self updateProgress:100 withType:type];
[self decodeImage:type];
} fail:^(int code, NSString *msg) {
@strongify(self)
self.isDownloading = NO;
// 如果图片的 uuid 一样(同一个用户连续发送同一张图片),同一个 path 可能触发多次下载操作,除了第一次,后面的下载会报错,这时候要再去判断下本地文件是否存在
[self decodeImage:type];
}];
}
- (void)updateProgress:(NSUInteger)progress withType:(TUIImageType)type
{
dispatch_async(dispatch_get_main_queue(), ^{
if (type == TImage_Type_Thumb)
self.thumbProgress = progress;
if (type == TImage_Type_Large)
self.largeProgress = progress;
if (type == TImage_Type_Origin)
self.originProgress = progress;
});
}
- (void)decodeImage:(TUIImageType)type
{
BOOL isExist = NO;
NSString *path = [self getImagePath:type isExist:&isExist];
if(!isExist)
{
return;
}
__weak typeof(self) weakSelf = self;
void (^finishBlock)(UIImage *) = ^(UIImage *image){
if (type == TImage_Type_Thumb) {
weakSelf.thumbImage = image;
weakSelf.thumbProgress = 100;
weakSelf.uploadProgress = 100;
}
if (type == TImage_Type_Large) {
weakSelf.largeImage = image;
weakSelf.largeProgress = 100;
}
if (type == TImage_Type_Origin) {
weakSelf.originImage = image;
weakSelf.originProgress = 100;
}
if (weakSelf.onFinish) {
weakSelf.onFinish();
}
};
NSString *cacheKey = [path substringFromIndex:TUIKit_Image_Path.length];
UIImage *cacheImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:cacheKey];
if (cacheImage) {
finishBlock(cacheImage);
} else {
[TUITool asyncDecodeImage:path complete:^(NSString *path, UIImage *image) {
dispatch_async(dispatch_get_main_queue(), ^{
if(![path containsString:@".gif"]) { // gif 图片过大, 不在内存进行缓存
[[SDImageCache sharedImageCache] storeImageToMemory:image forKey:cacheKey];
}
finishBlock(image);
});
}];
}
}
- (TUIImageItem *)getTImageItem:(TUIImageType)type
{
for (TUIImageItem *item in self.items) {
if(item.type == type){
return item;
}
}
return nil;
}
- (V2TIMImage *)getIMImage:(TUIImageType)type
{
V2TIMMessage *imMsg = self.innerMessage;
if (imMsg.elemType == V2TIM_ELEM_TYPE_IMAGE) {
for (V2TIMImage *imImage in imMsg.imageElem.imageList) {
if(type == TImage_Type_Thumb && imImage.type == V2TIM_IMAGE_TYPE_LARGE){
return imImage;
}
else if(type == TImage_Type_Origin && imImage.type == V2TIM_IMAGE_TYPE_ORIGIN){
return imImage;
}
else if(type == TImage_Type_Large && imImage.type == V2TIM_IMAGE_TYPE_LARGE){
return imImage;
}
}
}
return nil;
}
- (CGSize)contentSize
{
CGSize size = CGSizeZero;
BOOL isDir = NO;
if(![self.path isEqualToString:@""] &&
[[NSFileManager defaultManager] fileExistsAtPath:self.path isDirectory:&isDir]){
if(!isDir){
size = [UIImage imageWithContentsOfFile:self.path].size;
}
}
if (CGSizeEqualToSize(size, CGSizeZero)) {
for (TUIImageItem *item in self.items) {
if(item.type == TImage_Type_Thumb){
size = item.size;
}
}
}
if (CGSizeEqualToSize(size, CGSizeZero)) {
for (TUIImageItem *item in self.items) {
if(item.type == TImage_Type_Large){
size = item.size;
}
}
}
if (CGSizeEqualToSize(size, CGSizeZero)) {
for (TUIImageItem *item in self.items) {
if(item.type == TImage_Type_Origin){
size = item.size;
}
}
}
if(CGSizeEqualToSize(size, CGSizeZero)){
return size;
}
if(size.height > size.width){
size.width = size.width / size.height * TImageMessageCell_Image_Height_Max;
size.height = TImageMessageCell_Image_Height_Max;
} else {
size.height = size.height / size.width * TImageMessageCell_Image_Width_Max;
size.width = TImageMessageCell_Image_Width_Max;
}
return size;
}
@end