Files
featherVoice/TUIKit/TUIChat/UI_Minimalist/Chat/TUIChatSmallTongueView_Minimalist.m

226 lines
7.3 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// TUIChatSmallTongue.m
// TUIChat
//
// Created by xiangzhang on 2022/1/6.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUIChatSmallTongueView_Minimalist.h"
#import <TIMCommon/TIMDefine.h>
#import <TUICore/TUIDarkModel.h>
#import <TUICore/TUIThemeManager.h>
#import "TUIChatConfig.h"
#define TongueMiddleSpace 5.f
#define TongueRightSpace 10.f
#define TongueFontSize 14
@interface TUIChatSmallTongueView_Minimalist ()
@property(nonatomic, strong) UIImageView *imageView;
@property(nonatomic, strong) UILabel *label;
@end
@implementation TUIChatSmallTongueView_Minimalist {
TUIChatSmallTongue_Minimalist *_tongue;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// shadow
self.layer.shadowColor = RGBA(0, 0, 0, 0.15).CGColor;
self.layer.shadowOpacity = 1;
self.layer.shadowOffset = CGSizeMake(0, 0);
self.layer.shadowRadius = 2;
self.clipsToBounds = NO;
// backgroudView
UIImageView *backgroudView = [[UIImageView alloc] initWithFrame:frame];
[self addSubview:backgroudView];
backgroudView.mm_fill();
backgroudView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
UIImage *bkImage = [[TUIImageCache sharedInstance] getResourceFromCache:TUIChatImagePath_Minimalist(@"small_tongue_bk")];
bkImage = [bkImage rtl_imageFlippedForRightToLeftLayoutDirection];
UIEdgeInsets ei = UIEdgeInsetsFromString(@"{5,12,5,5}");
ei = rtlEdgeInsetsWithInsets(ei);
backgroudView.image = [bkImage resizableImageWithCapInsets:ei resizingMode:UIImageResizingModeStretch];
// tap
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap)];
[self addGestureRecognizer:tap];
}
return self;
}
- (void)onTap {
if (self.delegate && [self.delegate respondsToSelector:@selector(onChatSmallTongueClick:)]) {
[self.delegate onChatSmallTongueClick:_tongue];
}
}
- (void)setTongue:(TUIChatSmallTongue_Minimalist *)tongue {
_tongue = tongue;
if (!self.imageView) {
self.imageView = [[UIImageView alloc] init];
[self addSubview:self.imageView];
}
self.imageView.image = [TUIChatSmallTongueView_Minimalist getTongueImage:tongue];
self.imageView.mm_width(kScale390(18)).mm_height(kScale390(18)).mm_left(kScale390(18)).mm_top(kScale390(5));
if (!self.label) {
self.label = [[UILabel alloc] init];
self.label.font = [UIFont systemFontOfSize:TongueFontSize];
[self addSubview:self.label];
}
NSString *text = [TUIChatSmallTongueView_Minimalist getTongueText:tongue];
;
if (text) {
self.label.hidden = NO;
self.label.text = text;
self.label.textAlignment = NSTextAlignmentCenter;
self.label.textColor = TUIChatDynamicColor(@"chat_drop_down_color", @"#147AFF");
self.label.mm_width(kScale390(16)).mm_height(kScale390(20)).mm_top(self.imageView.mm_b + kScale390(2)).mm__centerX(self.imageView.mm_centerX);
} else {
self.label.hidden = YES;
}
}
+ (CGFloat)getTongueWidth:(TUIChatSmallTongue_Minimalist *)tongue {
return kScale390(54);
}
+ (CGFloat)getTongueHeight:(TUIChatSmallTongue_Minimalist *)tongue {
CGFloat tongueHeight = 0;
switch (tongue.type) {
case TUIChatSmallTongueType_ScrollToBoom: {
tongueHeight = kScale390(29);
} break;
case TUIChatSmallTongueType_ReceiveNewMsg: {
tongueHeight = kScale390(47);
} break;
case TUIChatSmallTongueType_SomeoneAt: {
tongueHeight = kScale390(47);
} break;
default:
break;
}
return tongueHeight;
}
+ (NSString *)getTongueText:(TUIChatSmallTongue_Minimalist *)tongue {
NSString *tongueText = nil;
switch (tongue.type) {
case TUIChatSmallTongueType_ScrollToBoom: {
tongueText = nil;
} break;
case TUIChatSmallTongueType_ReceiveNewMsg: {
tongueText = [NSString stringWithFormat:@"%@", tongue.unreadMsgCount > 99 ? @"99+" : @(tongue.unreadMsgCount)];
} break;
case TUIChatSmallTongueType_SomeoneAt: {
tongueText = [NSString stringWithFormat:@"%@", tongue.atMsgSeqs.count > 99 ? @"99+" : @(tongue.atMsgSeqs.count)];
} break;
default:
break;
}
return tongueText;
}
+ (UIImage *)getTongueImage:(TUIChatSmallTongue_Minimalist *)tongue {
UIImage *tongueImage = nil;
switch (tongue.type) {
case TUIChatSmallTongueType_ScrollToBoom: {
tongueImage = [[TUIImageCache sharedInstance] getResourceFromCache:TUIChatImagePath_Minimalist(@"small_tongue_scroll_to_boom")];
} break;
case TUIChatSmallTongueType_ReceiveNewMsg: {
tongueImage = [[TUIImageCache sharedInstance] getResourceFromCache:TUIChatImagePath_Minimalist(@"small_tongue_scroll_to_boom")];
break;
}
case TUIChatSmallTongueType_SomeoneAt: {
tongueImage = [[TUIImageCache sharedInstance] getResourceFromCache:TUIChatImagePath_Minimalist(@"small_tongue_someone_at_me")];
} break;
default:
break;
}
return tongueImage;
}
@end
@implementation TUIChatSmallTongue_Minimalist
- (instancetype)init {
self = [super init];
if (self) {
self.type = TUIChatSmallTongueType_None;
}
return self;
}
@end
static TUIChatSmallTongueView_Minimalist *gTongueView = nil;
static TUIChatSmallTongue_Minimalist *gTongue = nil;
@implementation TUIChatSmallTongueManager_Minimalist
+ (void)showTongue:(TUIChatSmallTongue_Minimalist *)tongue delegate:(id<TUIChatSmallTongueViewDelegate_Minimalist>)delegate {
if (tongue.type == gTongue.type
&& tongue.parentView == gTongue.parentView
&& tongue.unreadMsgCount == gTongue.unreadMsgCount
&& tongue.atMsgSeqs == gTongue.atMsgSeqs
&& !gTongueView.hidden) {
return;
}
gTongue = tongue;
if (!gTongueView) {
gTongueView = [[TUIChatSmallTongueView_Minimalist alloc] init];
} else {
[gTongueView removeFromSuperview];
}
CGFloat tongueWidth = [TUIChatSmallTongueView_Minimalist getTongueWidth:gTongue];
CGFloat tongueHeight = [TUIChatSmallTongueView_Minimalist getTongueHeight:gTongue];
if(isRTL()) {
gTongueView.frame =
CGRectMake(kScale390(16),
tongue.parentView.mm_h - Bottom_SafeHeight - TTextView_Height - 20 - tongueHeight,
tongueWidth, tongueHeight);
}
else {
gTongueView.frame =
CGRectMake(tongue.parentView.mm_w - kScale390(54),
tongue.parentView.mm_h - Bottom_SafeHeight - TTextView_Height - 20 - tongueHeight,
tongueWidth, tongueHeight);
}
gTongueView.delegate = delegate;
[gTongueView setTongue:gTongue];
[tongue.parentView addSubview:gTongueView];
}
+ (void)removeTongue:(TUIChatSmallTongueType)type {
if (type != gTongue.type) {
return;
}
[self removeTongue];
}
+ (void)removeTongue {
gTongue = nil;
if (gTongueView) {
[gTongueView removeFromSuperview];
gTongueView = nil;
}
}
+ (void)hideTongue:(BOOL)isHidden {
if (gTongueView) {
gTongueView.hidden = isHidden;
}
}
@end