Files
featherVoice/TUIKit/TUIChat/BaseCellData/Base/TUITextMessageCellData.m

125 lines
4.2 KiB
Mathematica
Raw Permalink Normal View History

2025-08-08 10:49:36 +08:00
//
// TUITextMessageCellData.m
// TXIMSDK_TUIKit_iOS
//
// Created by annidyfeng on 2019/5/21.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUITextMessageCellData.h"
#import <TIMCommon/NSString+TUIEmoji.h>
#import <TIMCommon/TIMCommonModel.h>
#import <TIMCommon/TIMDefine.h>
#import <TUICore/TUIThemeManager.h>
#ifndef CGFLOAT_CEIL
#ifdef CGFLOAT_IS_DOUBLE
#define CGFLOAT_CEIL(value) ceil(value)
#else
#define CGFLOAT_CEIL(value) ceilf(value)
#endif
#endif
@interface TUITextMessageCellData ()
@property(nonatomic, assign) CGSize size;
@property(nonatomic, assign) CGFloat containerWidth;
@property(nonatomic, strong) NSMutableAttributedString *attributedString;
@end
@implementation TUITextMessageCellData
{
NSString *_content;
}
+ (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
TUITextMessageCellData *textData = [[TUITextMessageCellData alloc] initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
textData.content = message.textElem.text;
textData.reuseId = TTextMessageCell_ReuseId;
textData.status = Msg_Status_Init;
return textData;
}
+ (NSString *)getDisplayString:(V2TIMMessage *)message {
NSString *content = message.textElem.text;
return content.getLocalizableStringWithFaceContent;
}
- (Class)getReplyQuoteViewDataClass {
return NSClassFromString(@"TUITextReplyQuoteViewData");
}
- (Class)getReplyQuoteViewClass {
return NSClassFromString(@"TUITextReplyQuoteView");
}
- (instancetype)initWithDirection:(TMsgDirection)direction {
self = [super initWithDirection:direction];
if (self) {
if (direction == MsgDirectionIncoming) {
self.cellLayout = [TUIMessageCellLayout incommingTextMessageLayout];
} else {
self.cellLayout = [TUIMessageCellLayout outgoingTextMessageLayout];
}
}
return self;
}
- (void)setContent:(NSString *)content {
if (![_content isEqualToString:content]) {
_content = content;
_attributedString = nil;
}
}
- (NSString *)content {
return _content;
}
- (NSAttributedString *)getContentAttributedString:(UIFont *)textFont {
if (!_attributedString) {
_emojiLocations = [NSMutableArray array];
_attributedString = [self.content getFormatEmojiStringWithFont:textFont emojiLocations:_emojiLocations];
if (self.isAudioCall || self.isVideoCall) {
NSTextAttachment *attchment = [[NSTextAttachment alloc] init];
UIImage *image = nil;
if (self.isAudioCall) {
image = TUIChatCommonBundleImage(@"audio_call");
}
if (self.isVideoCall) {
if (self.isCaller) {
image = TUIChatCommonBundleImage(@"video_call_self");
} else {
image = TUIChatCommonBundleImage(@"video_call");
}
}
attchment.image = image;
attchment.bounds = CGRectMake(0, -(textFont.lineHeight - textFont.pointSize) / 2, 16, 16);
NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:(NSTextAttachment *)(attchment)];
NSAttributedString *spaceString = [[NSAttributedString alloc] initWithString:@" " attributes:@{NSFontAttributeName : textFont}];
if (self.isCaller) {
[_attributedString appendAttributedString:spaceString];
[_attributedString appendAttributedString:imageString];
} else {
[_attributedString insertAttributedString:spaceString atIndex:0];
[_attributedString insertAttributedString:imageString atIndex:0];
}
}
}
return _attributedString;
}
- (CGSize)getContentAttributedStringSize:(NSAttributedString *)attributeString maxTextSize:(CGSize)maxTextSize {
CGRect rect = [attributeString boundingRectWithSize:maxTextSize
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
context:nil];
CGFloat width = CGFLOAT_CEIL(rect.size.width);
CGFloat height = CGFLOAT_CEIL(rect.size.height);
return CGSizeMake(width, height);
}
@end