Files
featherVoice/QXLive/Room(房间)/View/QXRoomChatListView.m
2025-11-28 22:43:06 +08:00

1299 lines
55 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// QXRoomChatListView.m
// QXLive
//
// Created by 启星 on 2025/6/7.
//
#import "QXRoomChatListView.h"
#import "UIImage+WebP.h"
#import <AVFoundation/AVFoundation.h>
#define messageNoticeColor RGB16(0xCCA882)
#define messageNameColor RGB16(0x00C8FF)
#define messageGiftColor RGB16(0xFFE309)
#define messageBubbleColor RGB16A(0x000000, 0.3)
#define messageBubbleMargin 2
NSArray<NSValue *> *findAllOccurrencesOfString(NSString *fullString, NSString *substring) {
NSMutableArray<NSValue *> *occurrences = [NSMutableArray array];
NSRange searchRange = NSMakeRange(0, fullString.length);
NSRange foundRange;
while (searchRange.location < fullString.length) {
searchRange.length = fullString.length - searchRange.location;
foundRange = [fullString rangeOfString:substring
options:0
range:searchRange];
if (foundRange.location != NSNotFound) {
// 找到匹配,添加到数组
[occurrences addObject:[NSValue valueWithRange:foundRange]];
// 更新搜索范围,从当前匹配位置之后继续搜索
searchRange.location = foundRange.location + foundRange.length;
} else {
// 没有更多匹配,退出循环
break;
}
}
return [occurrences copy];
}
NSInteger maxMessageCount = 20;
@interface QXRoomChatListView() <UITableViewDelegate,UITableViewDataSource,QXRoomSeatDelegate>
@property (nonatomic,strong)UITableView *tableView;
@property (nonatomic,strong)NSMutableArray *dataArray;
@property (nonatomic,strong)NSMutableArray *giftArray;
@property (nonatomic,strong)NSMutableArray *chatArray;
@property (nonatomic,assign)NSInteger messageCount;
//@property (nonatomic,strong)UIButton *allBtn;
//@property (nonatomic,strong)UIButton *chatBtn;
//@property (nonatomic,strong)UIButton *giftBtn;
//@property (nonatomic,strong)UIButton *selectedBtn;
@property (nonatomic,assign)BOOL isDragging;
@property (nonatomic,strong)UILabel *messageLabel;
@property (nonatomic,strong)UIButton *messageCountBtn;
@property (nonatomic,strong)AVSpeechSynthesizer *synthesizer;
@end
@implementation QXRoomChatListView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.synthesizer = [[AVSpeechSynthesizer alloc] init];
[self addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self).offset(10);
make.bottom.equalTo(self).offset(-10);
}];
// self.allBtn = [[UIButton alloc] init];
// NSAttributedString *allAttrNor = [[NSAttributedString alloc] initWithString:QXText(@"全部") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// NSAttributedString *allAttrSel = [[NSAttributedString alloc] initWithString:QXText(@"全部") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:16],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// [self.allBtn setAttributedTitle:allAttrNor forState:UIControlStateNormal];
// [self.allBtn setAttributedTitle:allAttrSel forState:UIControlStateSelected];
// self.allBtn.selected = YES;
// self.selectedBtn = self.allBtn;
// [self.allBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self addSubview:self.allBtn];
// [self.allBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(16);
// make.top.equalTo(self);
// make.height.mas_equalTo(40);
// make.width.mas_equalTo(50);
// }];
//
// self.chatBtn = [[UIButton alloc] init];
// NSAttributedString *chatAttrNor = [[NSAttributedString alloc] initWithString:QXText(@"聊天") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// NSAttributedString *chatAttrSel = [[NSAttributedString alloc] initWithString:QXText(@"聊天") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:16],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// [self.chatBtn setAttributedTitle:chatAttrNor forState:UIControlStateNormal];
// [self.chatBtn setAttributedTitle:chatAttrSel forState:UIControlStateSelected];
// [self.chatBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self addSubview:self.chatBtn];
// [self.chatBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.allBtn.mas_right).offset(5);
// make.top.equalTo(self);
// make.height.mas_equalTo(40);
// make.width.mas_equalTo(50);
// }];
//
// self.giftBtn = [[UIButton alloc] init];
// NSAttributedString *giftAttrNor = [[NSAttributedString alloc] initWithString:QXText(@"礼物") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// NSAttributedString *giftAttrSel = [[NSAttributedString alloc] initWithString:QXText(@"礼物") attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:16],NSForegroundColorAttributeName:[UIColor whiteColor]}];
// [self.giftBtn setAttributedTitle:giftAttrNor forState:UIControlStateNormal];
// [self.giftBtn setAttributedTitle:giftAttrSel forState:UIControlStateSelected];
// [self.giftBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self addSubview:self.giftBtn];
// [self.giftBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.chatBtn.mas_right).offset(5);
// make.top.equalTo(self);
// make.height.mas_equalTo(40);
// make.width.mas_equalTo(50);
// }];
self.messageCountBtn = [[UIButton alloc] init];;
[self.messageCountBtn setTitleColor:RGB16(0xB265FA) forState:(UIControlStateNormal)];
self.messageCountBtn.backgroundColor = [UIColor whiteColor];
[self.messageCountBtn addRoundedCornersWithRadius:10];
self.messageCountBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[self.messageCountBtn addTarget:self action:@selector(scrollToBottom) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.messageCountBtn];
self.messageCountBtn.hidden = YES;
[self.messageCountBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(-40);
make.bottom.equalTo(self);
make.height.mas_equalTo(20);
make.width.mas_equalTo(75);
}];
// self.messageLabel = [[UILabel alloc] init];
// self.messageLabel.textColor = [UIColor whiteColor];
// self.messageLabel.text = @"张三进入了房间";
// self.messageLabel.font = [UIFont systemFontOfSize:12];
// [self addSubview:self.messageLabel];
// [self.messageLabel mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(16);
// make.bottom.equalTo(self).offset(-5);
// make.height.mas_equalTo(20);
// make.right.equalTo(self);
// }];
}
-(void)typeAction:(UIButton*)sender{
// self.selectedBtn.selected = !self.selectedBtn.selected;
// sender.selected = !sender.selected;
// self.selectedBtn = sender;
// [self.tableView reloadData];
// [self scrollToBottom];
}
-(void)scrollToBottom{
NSArray *arr;
// if (self.selectedBtn == self.chatBtn) {
// arr = self.chatArray;
// }else if (self.selectedBtn == self.giftBtn) {
// arr = self.giftArray;
// }else{
arr = self.dataArray;
// }
if (arr.count > 0) {
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:arr.count-1 inSection:0] atScrollPosition:(UITableViewScrollPositionBottom) animated:YES];
}
self.isDragging = NO;
self.messageCount = 0;
self.messageCountBtn.hidden = YES;
}
-(void)insertNoitce{
QXRoomChatListModel *model = [QXRoomChatListModel new];
model.messageType = QXRoomChatMessageTypeNotice;
model.text = @"羽声语音严禁未成年人进行直播或打赏官方将24小时在线巡查。我们提倡绿色直播直播间严禁出现涉政、涉恐、涉黄、涉赌等违法违规内容严禁宣传封建迷信、宗教极端思想、出现低俗色情、吸烟酗酒等内容严禁违反社会主义核心价值观、践踏社会道德底线、诱导打赏、低俗 PK 、买卖金币等行为,请大家共同遵守、监督并及时举报。请勿相信各类刷钻、购买礼包、游戏币及电商贩卖等非官方广告信息,谨防网络诈骗。";
[self.dataArray addObject:model];
[self.tableView reloadData];
[self scrollToBottom];
}
-(void)insertMessage:(QXRoomChatListModel *)model{
/// 非礼物插入
// if (model.messageType != QXRoomChatMessageTypeGift) {
[self.dataArray addObject:model];
// }
// if (model.messageType == QXRoomChatMessageTypeChat) {
// [self.chatArray addObject:model];
// }
// if (model.messageType == QXRoomChatMessageTypeGift) {
// [self.giftArray addObject:model];
// }
// if (self.dataArray.count>maxMessageCount) {
// [self.dataArray removeFirstObject];
// }
// if (self.chatArray.count>maxMessageCount) {
// [self.chatArray removeFirstObject];
// }
// if (self.giftArray.count>maxMessageCount) {
// [self.giftArray removeFirstObject];
// }
#if DEBUG
if (model.messageType == QXRoomChatMessageTypeGift || model.messageType == QXRoomChatMessageTypeSystem || model.messageType == QXRoomChatMessageTypeChat) {
NSString *text = @"";
if (model.messageType == QXRoomChatMessageTypeGift || model.messageType == QXRoomChatMessageTypeSystem) {
text = model.text;
}else{
text = [NSString stringWithFormat:@"%@说:%@",model.FromUserInfo.nickname,model.text];
}
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:text];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
utterance.rate = 0.5 ;
utterance.pitchMultiplier = 1.0 ;
utterance.volume = 1.0 ;
[self.synthesizer speakUtterance:utterance];
}
#endif
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:self.dataArray.count - 1 inSection:0];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
if (self.isDragging) {
self.messageCount++;
self.messageCountBtn.hidden = NO;
[self.messageCountBtn setTitle:[NSString localizedStringWithFormat:QXText(@"%@条新消息"),[NSString stringWithFormat:@"%ld",self.messageCount]] forState:(UIControlStateNormal)];
}else{
[self scrollToBottom];
}
}
-(void)clearMessage{
[self.dataArray removeAllObjects];
[self.giftArray removeAllObjects];
[self.chatArray removeAllObjects];
[self.tableView reloadData];
}
-(void)previewUserInfoWithUserId:(NSString *)userId{
if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) {
[self.delegate previewUserInfoWithUserId:userId];
}
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// if (self.selectedBtn == self.chatBtn) {
// return self.chatArray.count;
// }
// if (self.selectedBtn == self.giftBtn) {
// return self.giftArray.count;
// }
return self.dataArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
QXRoomChatListModel *model;
// if (self.selectedBtn == self.chatBtn) {
// model = self.chatArray[indexPath.row];
// }else if (self.selectedBtn == self.giftBtn) {
// model = self.giftArray[indexPath.row];
// }else{
model = self.dataArray[indexPath.row];
// }
// model.havBubble = indexPath.row%2;
if (model.messageType == QXRoomChatMessageTypeChat) {
QXRoomChatListCell *cell = [QXRoomChatListCell cellWithTableView:tableView];
cell.delegate = self;
cell.message = model;
return cell;
}else if (model.messageType == QXRoomChatMessageTypeGift) {
QXRoomGiftListCell *cell = [QXRoomGiftListCell cellWithTableView:tableView];
cell.delegate = self;
cell.message = model;
return cell;
}else if(model.messageType == QXRoomChatMessageTypeEmoji){
QXRoomEmojiListCell *cell = [QXRoomEmojiListCell cellWithTableView:tableView];
cell.delegate = self;
cell.message = model;
return cell;
}else{
QXRoomChatListSystemCell *cell = [QXRoomChatListSystemCell cellWithTableView:tableView];
cell.message = model;
return cell;
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([cell isKindOfClass:[QXRoomChatListCell class]]) {
QXRoomChatListCell *Listcell = (QXRoomChatListCell *)cell;
[Listcell loadBubble];
[Listcell nameStartAnimate];
return;
}
if ([cell isKindOfClass:[QXRoomGiftListCell class]]) {
QXRoomGiftListCell *Listcell = (QXRoomGiftListCell *)cell;
[Listcell loadBubble];
return;
}
if ([cell isKindOfClass:[QXRoomEmojiListCell class]]) {
QXRoomEmojiListCell *Listcell = (QXRoomEmojiListCell *)cell;
[Listcell loadBubble];
[Listcell nameStartAnimate];
return;
}
}
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([cell isKindOfClass:[QXRoomChatListCell class]]) {
QXRoomChatListCell *Listcell = (QXRoomChatListCell *)cell;
[Listcell.bubbleImageView sd_cancelLatestImageLoad];
[Listcell nameStopAnimate];
}
if ([cell isKindOfClass:[QXRoomGiftListCell class]]) {
QXRoomGiftListCell *Listcell = (QXRoomGiftListCell *)cell;
[Listcell.bubbleImageView sd_cancelLatestImageLoad];
return;
}
if ([cell isKindOfClass:[QXRoomEmojiListCell class]]) {
QXRoomEmojiListCell *Listcell = (QXRoomEmojiListCell *)cell;
[Listcell.bubbleImageView sd_cancelLatestImageLoad];
[Listcell.animatedImageView sd_cancelLatestImageLoad];
[Listcell nameStopAnimate];
return;
}
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
QXRoomChatListModel *model;
// if (self.selectedBtn == self.chatBtn) {
// model = self.chatArray[indexPath.row];
// }else if (self.selectedBtn == self.giftBtn) {
// model = self.giftArray[indexPath.row];
// }else{
model = self.dataArray[indexPath.row];
// }
CGFloat height = 0;
if (model.messageType == QXRoomChatMessageTypeChat) {
if ([model.FromUserInfo.chat_bubble isExist]) {
height = [model.text heightForFont:[UIFont systemFontOfSize:14] width:ScaleWidth(280)-60-18];
height = 28+19+13+16 + height;
}else{
height = [model.text heightForFont:[UIFont systemFontOfSize:14] width:ScaleWidth(280)-60-18-16];
height = 28+19+13+8 + height;
}
}else if (model.messageType == QXRoomChatMessageTypeGift) {
height = [model.text heightForFont:[UIFont systemFontOfSize:12] width:ScaleWidth(280)-16-8-8*2] + 12+4+1;
}else if(model.messageType == QXRoomChatMessageTypeEmoji){
if ([model.FromUserInfo.chat_bubble isExist]) {
height = 28+19+13+16 + 40;
}else{
height = 28+19+13+8 + 40;
}
}else{
height = [model.text heightForFont:[UIFont systemFontOfSize:12] width:ScaleWidth(280)-16-8-8*2] + 12+4+1;
}
return height;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
QXRoomChatListModel *model;
// if (self.selectedBtn == self.chatBtn) {
// model = self.chatArray[indexPath.row];
// }else if (self.selectedBtn == self.giftBtn) {
// model = self.giftArray[indexPath.row];
// }else{
model = self.dataArray[indexPath.row];
// }
if (model.FromUserInfo.user_id.longValue > 0 && model.messageType == QXRoomChatMessageTypeSystem) {
if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) {
[self.delegate previewUserInfoWithUserId:model.FromUserInfo.user_id];
}
}
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat height = scrollView.frame.size.height;
CGFloat contentYoffset = scrollView.contentOffset.y;
CGFloat distanceFromBottom = scrollView.contentSize.height - contentYoffset;
if (distanceFromBottom < height) {
self.isDragging = NO;
self.messageCountBtn.hidden = YES;
}
// CGFloat bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
// if (scrollView.contentSize.height-bottomEdge) {
// self.messageCountBtn.hidden = YES;
// }
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
self.isDragging = YES;
}
-(UITableView *)tableView{
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:(UITableViewStylePlain)];
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView.backgroundColor = [UIColor clearColor];
_tableView.tableFooterView = [UIView new];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.showsHorizontalScrollIndicator = NO;
_tableView.showsVerticalScrollIndicator = NO;
if (@available(iOS 15.0, *)) {
_tableView.sectionHeaderTopPadding = 0;
} else {
// Fallback on earlier versions
}
}
return _tableView;
}
-(NSMutableArray *)dataArray{
if (!_dataArray) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}
-(NSMutableArray *)giftArray{
if (!_giftArray) {
_giftArray =[ NSMutableArray array];
}
return _giftArray;
}
-(NSMutableArray *)chatArray{
if (!_chatArray) {
_chatArray = [NSMutableArray array];
}
return _chatArray;
}
@end
@implementation QXRoomChatListCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString* cellId = @"QXRoomChatListCell";
QXRoomChatListCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[QXRoomChatListCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
return cell;
}
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundColor = [UIColor clearColor];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self initSubviews];
}
return self;
}
-(void)headerAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) {
[self.delegate previewUserInfoWithUserId:self.message.FromUserInfo.user_id];
}
}
-(void)setMessage:(QXRoomChatListModel *)message{
_message = message;
// self.titleLabel.text = message.text;
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:message.text];
if ([message.FromUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.FromUserInfo.nickname]];
}
if ([message.ToUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.ToUserInfo.nickname]];
}
if ([message.GiftInfo.gift_name isExist]) {
NSArray *arr = [message.GiftInfo.gift_name componentsSeparatedByString:@","];
for (NSString*gift_name in arr) {
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, gift_name);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageGiftColor range:range];
}
}
}
if (message.GiftInfos.count > 0) {
for (QXGiftModel*gift in message.GiftInfos) {
if ([gift.gift_name isExist]) {
[attr yy_setColor:messageGiftColor range:[message.text rangeOfString:gift.gift_name]];
}
}
}
if (message.ToUserInfos.count > 0) {
for (int i = 0; i < message.ToUserInfos.count; i++) {
QXUserHomeModel*md = message.ToUserInfos[i];
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, md.nickname);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageNameColor range:range];
}
}
}
self.titleLabel.attributedText = attr;
self.nameLabel.text = message.FromUserInfo.nickname;
// if ([message.FromUserInfo.nickname_color isExist]) {
// self.nameLabel.textColor = [UIColor colorWithHexString:message.FromUserInfo.nickname_color];
// }else{
// self.nameLabel.textColor = RGB16(0xDED6ED);
// }
[self.headerImageView setHeadIcon:message.FromUserInfo.avatar dress:@""];
[self.headerImageView.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.nobility_image]];
self.iconBgView.hidden = YES;
for (int i = 0;i < message.FromUserInfo.icon.count;i++) {
if (i < 3) {
self.iconBgView.hidden = NO;
UIImageView *iconImageView = self.iconViewArray[i];
iconImageView.hidden = NO;
[iconImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.icon[i]]];
}else{
self.iconBgView.hidden = YES;
}
}
}
-(void)initSubviews{
self.bgView = [[UIView alloc] init];
[self.contentView addSubview:self.bgView];
[self.bgView addRoundedCornersWithRadius:8];
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(0);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
self.bubbleImageView = [[UIImageView alloc] init];
self.bubbleImageView.contentMode = UIViewContentModeScaleToFill;
[self.bubbleImageView addRoundedCornersWithRadius:6];
self.bubbleImageView.backgroundColor = messageBubbleColor;
[self.bgView addSubview:self.bubbleImageView];
[self.bubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.bgView);
make.top.mas_equalTo(-4);
make.bottom.mas_equalTo(4);
}];
self.headerImageView = [[QXSeatHeaderView alloc] init];
[self.bgView addSubview:self.headerImageView];
[self.headerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.top.mas_equalTo(19);
make.width.mas_equalTo(28);
make.height.mas_equalTo(34);
}];
UIButton *headerBtn = [[UIButton alloc] init];
[headerBtn addTarget:self action:@selector(headerAction) forControlEvents:(UIControlEventTouchUpInside)];
[self.bgView addSubview:headerBtn];
[headerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.headerImageView).offset(-2);
make.bottom.right.equalTo(self.headerImageView).offset(2);
}];
self.nameLabel = [[CKShimmerLabel alloc] initWithFrame:CGRectMake(32, 0, 200, 24)];
// self.nameLabel.text = @"羽声语音";
self.nameLabel.shimmerWidth = 20;
self.nameLabel.shimmerRadius = 20;
self.nameLabel.durationTime = 1;
self.nameLabel.repeat = YES;
self.nameLabel.textColor = RGB16(0xDED6ED);
// self.nameLabel.shimmerColor = [UIColor yellowColor];
self.nameLabel.font = [UIFont boldSystemFontOfSize:14];
[self.bgView addSubview:self.nameLabel];
[self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.headerImageView).offset(-3);
make.left.equalTo(self.headerImageView.mas_right).offset(6);
make.height.mas_equalTo(18);
make.width.mas_greaterThanOrEqualTo(200);
}];
self.iconBgView = [[UIView alloc] init];
[self.bgView addSubview:self.iconBgView];
[self.iconBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel);
make.width.mas_equalTo(UserIconWidth*2+6);
make.height.mas_equalTo(16);
make.top.equalTo(self.nameLabel.mas_bottom).offset(2);
}];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textColor = [UIColor whiteColor];
self.titleLabel.font = [UIFont systemFontOfSize:14];
self.titleLabel.numberOfLines = 0;
[self.bgView addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel).offset(0);
make.top.equalTo(self.iconBgView.mas_bottom).offset(10);
make.right.mas_lessThanOrEqualTo(-18);
}];
self.nameLabel.text = @"张三站撒旦撒大萨达撒";
[self.contentView bringSubviewToFront:self.titleLabel];
self.iconBgView = [[UIView alloc] init];
[self.bgView addSubview:self.iconBgView];
[self.iconBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel);
make.width.mas_equalTo(UserIconWidth*2+6);
make.height.mas_equalTo(16);
make.top.equalTo(self.nameLabel.mas_bottom).offset(2);
}];
CGFloat iconWidth = UserIconWidth;
CGFloat iconHeight = UserIconHeight;
CGFloat margin = 6;
for (int i = 0; i < 3; i++) {
UIImageView *iconImageView = [[UIImageView alloc] init];
iconImageView.hidden = YES;
iconImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.iconBgView addSubview:iconImageView];
[iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(i*(iconWidth+margin));
make.width.mas_equalTo(iconWidth);
make.height.mas_equalTo(iconHeight);
make.centerY.equalTo(self.iconBgView);
}];
[self.iconViewArray addObject:iconImageView];
}
}
-(void)loadBubble{
if ([self.message.FromUserInfo.chat_bubble isExist]) {
self.bubbleImageView.backgroundColor = UIColor.clearColor;
self.bgView.backgroundColor = UIColor.clearColor;
// self.bubbleImageView.image = [[UIImage imageNamed:@"chat_bubble2"] resizableImageWithCapInsets:UIEdgeInsetsMake(30, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];;
[self.bubbleImageView sd_setImageWithURL:[NSURL URLWithString:self.message.FromUserInfo.chat_bubble] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(40, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];
self.bubbleImageView.image = image;
}];
[self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(8);
make.right.mas_equalTo(0);
make.top.mas_equalTo(0);
make.bottom.mas_equalTo(0);
}];
[self.headerImageView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.top.mas_equalTo(19);
}];
}else{
self.bgView.backgroundColor = messageBubbleColor;
[self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(-8);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
[self.headerImageView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(9);
make.top.mas_equalTo(11);
}];
self.bubbleImageView.image = nil;
self.bubbleImageView.backgroundColor = UIColor.clearColor;
}
}
-(void)nameStartAnimate{
if ([self.message.FromUserInfo.nickname_color isExist]) {
[self.nameLabel stopShimmer];
[self.nameLabel layoutSubviews];
self.nameLabel.shimmerWidth = 20;
self.nameLabel.shimmerRadius = 20;
self.nameLabel.durationTime = 1;
self.nameLabel.shimmerColor = [UIColor colorWithHexString:self.message.FromUserInfo.nickname_color];
[self.nameLabel startShimmer];
}
}
-(void)nameStopAnimate{
if ([self.message.FromUserInfo.nickname_color isExist]) {
self.nameLabel.shimmerColor = [UIColor colorWithHexString:self.message.FromUserInfo.nickname_color];
[self.nameLabel stopShimmer];
}
}
-(NSMutableArray *)iconViewArray{
if (!_iconViewArray) {
_iconViewArray = [NSMutableArray array];
}
return _iconViewArray;
}
@end
@implementation QXRoomGiftListCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString* cellId = @"QXRoomGiftListCell";
QXRoomGiftListCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[QXRoomGiftListCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
return cell;
}
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundColor = [UIColor clearColor];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self initSubviews];
}
return self;
}
-(void)headerAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) {
[self.delegate previewUserInfoWithUserId:self.message.FromUserInfo.user_id];
}
}
-(void)setMessage:(QXRoomChatListModel *)message{
_message = message;
// self.titleLabel.text = message.text;
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:message.text];
if ([message.FromUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.FromUserInfo.nickname]];
}
if ([message.ToUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.ToUserInfo.nickname]];
}
if ([message.GiftInfo.gift_name isExist]) {
NSArray *arr = [message.GiftInfo.gift_name componentsSeparatedByString:@","];
for (NSString*gift_name in arr) {
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, gift_name);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageGiftColor range:range];
}
}
}
if (message.GiftInfos.count > 0) {
for (QXGiftModel*gift in message.GiftInfos) {
if ([gift.gift_name isExist]) {
[attr yy_setColor:messageGiftColor range:[message.text rangeOfString:gift.gift_name]];
}
}
}
if (message.ToUserInfos.count > 0) {
for (int i = 0; i < message.ToUserInfos.count; i++) {
QXUserHomeModel*md = message.ToUserInfos[i];
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, md.nickname);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageNameColor range:range];
}
}
}
self.titleLabel.attributedText = attr;
// self.nameLabel.text = message.FromUserInfo.nickname;
// [self.headerImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.avatar]];
// self.iconBgView.hidden = YES;
// for (int i = 0;i < message.FromUserInfo.icon.count;i++) {
// if (i < 3) {
// self.iconBgView.hidden = NO;
// UIImageView *iconImageView = self.iconViewArray[i];
// iconImageView.hidden = NO;
// [iconImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.icon[i]]];
// }else{
// self.iconBgView.hidden = YES;
// }
// }
}
-(void)initSubviews{
self.bgView = [[UIView alloc] init];
[self.contentView addSubview:self.bgView];
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_lessThanOrEqualTo(-8);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
self.bubbleImageView = [[UIImageView alloc] init];
self.bubbleImageView.contentMode = UIViewContentModeScaleToFill;
[self.bubbleImageView addRoundedCornersWithRadius:6];
self.bubbleImageView.backgroundColor = messageBubbleColor;
[self.bgView addSubview:self.bubbleImageView];
[self.bubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.bgView);
}];
// self.headerImageView = [[UIImageView alloc] init];
// self.headerImageView.contentMode = UIViewContentModeScaleAspectFill;
// self.headerImageView.backgroundColor = [UIColor whiteColor];
// [self.headerImageView addRoundedCornersWithRadius:14];
// [self.bgView addSubview:self.headerImageView];
//
// [self.headerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(16);
// make.top.mas_equalTo(19);
// make.size.mas_equalTo(CGSizeMake(28, 28));
// }];
//
// UIButton *headerBtn = [[UIButton alloc] init];
// [headerBtn addTarget:self action:@selector(headerAction) forControlEvents:(UIControlEventTouchUpInside)];
// [self.bgView addSubview:headerBtn];
// [headerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.top.equalTo(self.headerImageView).offset(-2);
// make.bottom.right.equalTo(self.headerImageView).offset(2);
// }];
//
// self.nameLabel = [[UILabel alloc] init];
// self.nameLabel.textColor = RGB16(0xDED6ED);
// self.nameLabel.font = [UIFont systemFontOfSize:14];
// [self.bgView addSubview:self.nameLabel];
// [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
// make.top.equalTo(self.headerImageView).offset(-3);
// make.left.equalTo(self.headerImageView.mas_right).offset(8);
// make.height.mas_equalTo(18);
// }];
//
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textColor = [UIColor whiteColor];
self.titleLabel.font = [UIFont systemFontOfSize:12];
self.titleLabel.numberOfLines = 0;
[self.bgView addSubview:self.titleLabel];
// [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.nameLabel).offset(0);
// make.top.equalTo(self.headerImageView.mas_bottom).offset(13);
// make.right.mas_lessThanOrEqualTo(-18);
// }];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.bgView).offset(8);
make.top.mas_equalTo(2);
make.bottom.mas_equalTo(-2);
make.right.mas_equalTo(-8);
}];
// self.nameLabel.text = @"张三站撒旦撒大萨达撒";
[self.contentView bringSubviewToFront:self.titleLabel];
// self.iconBgView = [[UIView alloc] init];
// [self.bgView addSubview:self.iconBgView];
// [self.iconBgView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.nameLabel);
// make.width.mas_equalTo(UserIconWidth*2+6);
// make.height.mas_equalTo(16);
// make.top.equalTo(self.nameLabel.mas_bottom).offset(2);
// }];
//
// CGFloat iconWidth = UserIconWidth;
// CGFloat iconHeight = UserIconHeight;
// CGFloat margin = 6;
// for (int i = 0; i < 3; i++) {
// UIImageView *iconImageView = [[UIImageView alloc] init];
// iconImageView.hidden = YES;
// iconImageView.contentMode = UIViewContentModeScaleAspectFit;
// [self.iconBgView addSubview:iconImageView];
// [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(i*(iconWidth+margin));
// make.width.mas_equalTo(iconWidth);
// make.height.mas_equalTo(iconHeight);
// make.centerY.equalTo(self.iconBgView);
// }];
// [self.iconViewArray addObject:iconImageView];
// }
}
-(void)layoutSubviews{
[super layoutSubviews];
[self.bgView addRoundedCornersWithRadius:self.bgView.height/2];
}
-(void)loadBubble{
// if ([self.message.FromUserInfo.chat_bubble isExist]) {
// self.bubbleImageView.backgroundColor = UIColor.clearColor;
//// self.bubbleImageView.image = [[UIImage imageNamed:@"chat_bubble2"] resizableImageWithCapInsets:UIEdgeInsetsMake(30, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];;
// [self.bubbleImageView sd_setImageWithURL:[NSURL URLWithString:self.message.FromUserInfo.chat_bubble] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
// image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(40, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];
// self.bubbleImageView.image = image;
// }];
// [self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(8);
// make.right.mas_equalTo(0);
// make.top.mas_equalTo(0);
// make.bottom.mas_equalTo(0);
// }];
// [self.titleLabel mas_updateConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(16);
// make.top.mas_equalTo(16);
// make.bottom.mas_equalTo(-16);
// make.right.mas_equalTo(-16);
// }];
// }else{
// [self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(16);
// make.right.mas_equalTo(-8);
// make.top.mas_equalTo(messageBubbleMargin);
// make.bottom.mas_equalTo(-messageBubbleMargin);
// }];
// [self.titleLabel mas_updateConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(8);
// make.top.mas_equalTo(8);
// make.bottom.mas_equalTo(-8);
// make.right.mas_equalTo(-8);
// }];
// self.bubbleImageView.image = nil;
// self.bubbleImageView.backgroundColor = messageBubbleColor;
// }
}
//-(NSMutableArray *)iconViewArray{
// if (!_iconViewArray) {
// _iconViewArray = [NSMutableArray array];
// }
// return _iconViewArray;
//}
@end
@implementation QXRoomEmojiListCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString* cellId = @"QXRoomEmojiListCell";
QXRoomEmojiListCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[QXRoomEmojiListCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
return cell;
}
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundColor = [UIColor clearColor];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self initSubviews];
}
return self;
}
-(void)setMessage:(QXRoomChatListModel *)message{
_message = message;
self.nameLabel.text = message.FromUserInfo.nickname;
// if ([message.FromUserInfo.nickname_color isExist]) {
// self.nameLabel.textColor = [UIColor colorWithHexString:message.FromUserInfo.nickname_color];
// }else{
// self.nameLabel.textColor = RGB16(0xDED6ED);
// }
[self.headerImageView setHeadIcon:message.FromUserInfo.avatar dress:@""];
[self.headerImageView.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.nobility_image]];
self.iconBgView.hidden = YES;
for (int i = 0;i < message.FromUserInfo.icon.count;i++) {
if (i < 3) {
self.iconBgView.hidden = NO;
UIImageView *iconImageView = self.iconViewArray[i];
iconImageView.hidden = NO;
[iconImageView sd_setImageWithURL:[NSURL URLWithString:message.FromUserInfo.icon[i]]];
}else{
self.iconBgView.hidden = YES;
}
}
if (![message.emoji.animate_image isExist]) {
[self.animatedImageView sd_cancelCurrentImageLoad];
[self.animatedImageView sd_setImageWithURL:[NSURL URLWithString:message.emoji.image]];
return;
}
if (message.emoji.isAnimated) {
[self.animatedImageView sd_cancelCurrentImageLoad];
[self.animatedImageView sd_setImageWithURL:[NSURL URLWithString:message.emoji.image]];
}else{
message.emoji.isAnimated = YES;
NSURL *animiteUrl = [NSURL URLWithString:message.emoji.animate_image];
[self.animatedImageView sd_setImageWithURL:animiteUrl
placeholderImage:nil
options:SDWebImageHighPriority
completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
// 监听动画结束
if (image) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (double)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 动画结束后显示最后一帧
[self.animatedImageView.player stopPlaying];
[self.animatedImageView.player clearFrameBuffer];
[self.animatedImageView sd_cancelCurrentImageLoad];
[self.animatedImageView sd_setImageWithURL:[NSURL URLWithString:message.emoji.image]];
});
}else{
[self.animatedImageView sd_cancelCurrentImageLoad];
[self.animatedImageView sd_setImageWithURL:[NSURL URLWithString:message.emoji.image]];
}
}];
}
}
-(void)initSubviews{
self.bgView = [[UIView alloc] init];
self.bgView.backgroundColor = UIColor.clearColor;
[self.contentView addSubview:self.bgView];
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(0);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
self.bubbleImageView = [[UIImageView alloc] init];
self.bubbleImageView.contentMode = UIViewContentModeScaleToFill;
[self.bubbleImageView addRoundedCornersWithRadius:6];
self.bubbleImageView.backgroundColor = messageBubbleColor;
[self.bgView addSubview:self.bubbleImageView];
[self.bubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.bgView);
make.top.mas_equalTo(-4);
make.bottom.mas_equalTo(4);
}];
self.headerImageView = [[QXSeatHeaderView alloc] init];
[self.bgView addSubview:self.headerImageView];
[self.headerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.top.mas_equalTo(19);
make.width.mas_equalTo(28);
make.height.mas_equalTo(34);
}];
UIButton *headerBtn = [[UIButton alloc] init];
[headerBtn addTarget:self action:@selector(headerAction) forControlEvents:(UIControlEventTouchUpInside)];
[self.bgView addSubview:headerBtn];
[headerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.headerImageView).offset(-2);
make.bottom.right.equalTo(self.headerImageView).offset(2);
}];
self.nameLabel = [[CKShimmerLabel alloc] initWithFrame:CGRectMake(32, 0, 200, 24)];
// self.nameLabel.text = @"羽声语音";
self.nameLabel.shimmerWidth = 20;
self.nameLabel.shimmerRadius = 20;
self.nameLabel.durationTime = 1;
self.nameLabel.repeat = YES;
self.nameLabel.textColor = RGB16(0xDED6ED);
// self.nameLabel.shimmerColor = [UIColor yellowColor];
self.nameLabel.font = [UIFont boldSystemFontOfSize:14];
[self.bgView addSubview:self.nameLabel];
[self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.headerImageView).offset(-3);
make.left.equalTo(self.headerImageView.mas_right).offset(6);
make.height.mas_equalTo(18);
make.width.mas_greaterThanOrEqualTo(200);
}];
self.animatedImageView = [[SDAnimatedImageView alloc] init];
self.animatedImageView.shouldCustomLoopCount = YES;
self.animatedImageView.animationRepeatCount = 5;
self.animatedImageView.clearBufferWhenStopped = YES;
self.animatedImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.bgView addSubview:self.animatedImageView];
[self.animatedImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel).offset(0);
make.top.equalTo(self.headerImageView.mas_bottom).offset(13);
make.height.width.mas_equalTo(40);
}];
self.nameLabel.text = @"张三站撒旦撒大萨达撒";
self.iconBgView = [[UIView alloc] init];
[self.bgView addSubview:self.iconBgView];
[self.iconBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel);
make.width.mas_equalTo(UserIconWidth*2+6);
make.height.mas_equalTo(16);
make.top.equalTo(self.nameLabel.mas_bottom).offset(2);
}];
CGFloat iconWidth = UserIconWidth;
CGFloat iconHeight = UserIconHeight;
CGFloat margin = 6;
for (int i = 0; i < 3; i++) {
UIImageView *iconImageView = [[UIImageView alloc] init];
iconImageView.hidden = YES;
iconImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.iconBgView addSubview:iconImageView];
[iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(i*(iconWidth+margin));
make.width.mas_equalTo(iconWidth);
make.height.mas_equalTo(iconHeight);
make.centerY.equalTo(self.iconBgView);
}];
[self.iconViewArray addObject:iconImageView];
}
}
-(void)layoutSubviews{
[super layoutSubviews];
[self.bgView addRoundedCornersWithRadius:8];
}
-(void)loadBubble{
if ([self.message.FromUserInfo.chat_bubble isExist]) {
self.bubbleImageView.backgroundColor = UIColor.clearColor;
self.bgView.backgroundColor = UIColor.clearColor;
// self.bubbleImageView.image = [[UIImage imageNamed:@"chat_bubble2"] resizableImageWithCapInsets:UIEdgeInsetsMake(30, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];;
[self.bubbleImageView sd_setImageWithURL:[NSURL URLWithString:self.message.FromUserInfo.chat_bubble] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(40, 40, 40, 40) resizingMode:(UIImageResizingModeStretch)];
self.bubbleImageView.image = image;
}];
[self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(8);
make.right.mas_equalTo(0);
make.top.mas_equalTo(0);
make.bottom.mas_equalTo(0);
}];
[self.headerImageView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.top.mas_equalTo(19);
}];
}else{
[self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(-8);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
[self.headerImageView mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(9);
make.top.mas_equalTo(11);
}];
self.bubbleImageView.image = nil;
self.bubbleImageView.backgroundColor = UIColor.clearColor;
self.bgView.backgroundColor = messageBubbleColor;
}
}
-(void)nameStartAnimate{
if ([self.message.FromUserInfo.nickname_color isExist]) {
[self.nameLabel stopShimmer];
[self.nameLabel layoutSubviews];
self.nameLabel.shimmerWidth = 20;
self.nameLabel.shimmerRadius = 20;
self.nameLabel.durationTime = 1;
self.nameLabel.shimmerColor = [UIColor colorWithHexString:self.message.FromUserInfo.nickname_color];
[self.nameLabel startShimmer];
}
}
-(void)nameStopAnimate{
if ([self.message.FromUserInfo.nickname_color isExist]) {
self.nameLabel.shimmerColor = [UIColor colorWithHexString:self.message.FromUserInfo.nickname_color];
[self.nameLabel stopShimmer];
}
}
-(NSMutableArray *)iconViewArray{
if (!_iconViewArray) {
_iconViewArray = [NSMutableArray array];
}
return _iconViewArray;
}
@end
@implementation QXRoomChatListSystemCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString* cellId = @"QXRoomChatListSystemCell";
QXRoomChatListSystemCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[QXRoomChatListSystemCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
return cell;
}
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundColor = [UIColor clearColor];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self initSubviews];
}
return self;
}
-(void)layoutSubviews{
[super layoutSubviews];
if (self.message.messageType == QXRoomChatMessageTypeNotice) {
[self.bgView addRoundedCornersWithRadius:8];
}else{
[self.bgView addRoundedCornersWithRadius:self.bgView.height/2];
}
}
-(void)setMessage:(QXRoomChatListModel *)message{
_message = message;
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:message.text];
if ([message.FromUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.FromUserInfo.nickname]];
}
if ([message.ToUserInfo.nickname isExist]) {
[attr yy_setColor:messageNameColor range:[message.text rangeOfString:message.ToUserInfo.nickname]];
}
if ([message.GiftInfo.gift_name isExist]) {
NSArray *arr = [message.GiftInfo.gift_name componentsSeparatedByString:@","];
for (NSString*gift_name in arr) {
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, gift_name);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageGiftColor range:range];
}
}
}
if (message.GiftInfos.count > 0) {
for (QXGiftModel*gift in message.GiftInfos) {
if ([gift.gift_name isExist]) {
[attr yy_setColor:messageGiftColor range:[message.text rangeOfString:gift.gift_name]];
}
}
}
if (message.ToUserInfos.count > 0) {
for (int i = 0; i < message.ToUserInfos.count; i++) {
QXUserHomeModel*md = message.ToUserInfos[i];
NSArray<NSValue *> *occurrences = findAllOccurrencesOfString(message.text, md.nickname);
for (NSValue *rangeValue in occurrences) {
NSRange range = [rangeValue rangeValue];
[attr yy_setColor:messageNameColor range:range];
}
}
}
if (message.messageType == QXRoomChatMessageTypeNotice) {
[attr yy_setColor:messageNoticeColor range:NSMakeRange(0, attr.length)];
}
self.titleLabel.attributedText = attr;
}
-(void)initSubviews{
self.bgView = [[UIView alloc] init];
self.bgView.backgroundColor = messageBubbleColor;
[self.bgView addRoundedCornersWithRadius:6];
[self.contentView addSubview:self.bgView];
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_lessThanOrEqualTo(-8);
make.top.mas_equalTo(messageBubbleMargin);
make.bottom.mas_equalTo(-messageBubbleMargin);
}];
self.titleLabel = [[UILabel alloc] init];
// self.titleLabel.textColor = RGB16(0XD1A9FE);
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.font = [UIFont systemFontOfSize:12];
self.titleLabel.numberOfLines = 0;
[self.bgView addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.bgView).offset(8);
make.top.mas_equalTo(2);
make.bottom.mas_equalTo(-2);
make.right.mas_equalTo(-8);
}];
}
@end
@implementation QXRoomChatListModel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"GiftInfo" : @"QXGiftModel",
@"GiftInfos" : @"QXGiftModel",
@"FromUserInfo":@"QXUserHomeModel",
@"nextInfo":@"QXSongListModel",
@"songInfo":@"QXSongListModel",
@"ToUserInfo":@"QXUserHomeModel",
@"ToUserInfos":@"QXUserHomeModel",
@"friend_user":@"QXRoomFriendRelationModel"
};
}
- (BOOL)isSameGiftFromSameSender:(QXRoomChatListModel *)otherGift {
if (!otherGift) return NO;
return [self.GiftInfo.gift_id isEqualToString:otherGift.GiftInfo.gift_id] &&
[self.FromUserInfo.nickname isEqualToString:otherGift.FromUserInfo.nickname] &&
[self.ToUserInfo.nickname isEqualToString:otherGift.ToUserInfo.nickname];
}
- (instancetype)copy {
QXRoomChatListModel *copy = [[QXRoomChatListModel alloc] init];
QXGiftModel *gift = [[QXGiftModel alloc] init];
gift.gift_id = self.GiftInfo.gift_id;
gift.base_image = self.GiftInfo.base_image;
gift.gift_name = self.GiftInfo.gift_name;
copy.GiftInfo = gift;
QXUserHomeModel *fromUser = [[QXUserHomeModel alloc] init];
fromUser.nickname = self.FromUserInfo.nickname;
fromUser.avatar = self.FromUserInfo.avatar;
copy.FromUserInfo = fromUser;
QXUserHomeModel *toUser = [[QXUserHomeModel alloc] init];
toUser.nickname = self.FromUserInfo.nickname;
toUser.avatar = self.FromUserInfo.avatar;
copy.ToUserInfo = toUser;
copy.gift_num = self.gift_num;
return copy;
}
@end