Files
yinmeng-ios/xplan-ios/Main/Room/View/MessageContainerView/XPRoomMessageContainerView.m

317 lines
10 KiB
Mathematica
Raw Normal View History

2021-10-14 21:10:04 +08:00
//
// XPRoomMessageView.m
// xplan-ios
//
// Created by on 2021/10/11.
//
#import "XPRoomMessageContainerView.h"
2021-10-26 19:10:03 +08:00
///Third
#import <Masonry/Masonry.h>
#import <NIMSDK/NIMSDK.h>
#import <YYText/YYText.h>
///Tool
#import "ThemeColor.h"
#import "XPMacro.h"
#import "XPRoomMessageConstant.h"
2021-11-04 16:27:39 +08:00
#import "XPRoomMessageParser.h"
2021-10-26 19:10:03 +08:00
///Model
#import "RoomInfoModel.h"
#import "AttachMentModel.h"
2021-10-26 19:10:03 +08:00
///View
#import "XPRoomMessageTableViewCell.h"
#import "XPRoomMessageHeaderView.h"
#import "View/XPRoomMessageHeaderView.h"
2021-11-04 16:27:39 +08:00
@interface XPRoomMessageContainerView ()<UITableViewDelegate, UITableViewDataSource, NIMChatManagerDelegate>
///
@property (nonatomic,weak) id<RoomHostDelegate> hostDelegate;
2021-10-26 19:10:03 +08:00
///
@property (nonatomic,strong) UITableView *messageTableView;
///
@property (nonatomic,strong) XPRoomMessageHeaderView *headerView;
///
@property (nonatomic,strong) UIButton *messageTipsBtn;
///
@property (nonatomic,assign) BOOL isPending;
2021-11-04 16:27:39 +08:00
///
@property (nonatomic,strong) NSMutableArray<NSAttributedString *> *datasource;
///
@property (nonatomic,strong) NSMutableArray<NIMMessage *> *incomingMessages;
2021-10-26 19:10:03 +08:00
@end
2021-10-14 21:10:04 +08:00
@implementation XPRoomMessageContainerView
2021-10-14 21:10:04 +08:00
- (instancetype)initWithDelegate:(id<RoomHostDelegate>)delegate {
self = [super init];
2021-10-14 21:10:04 +08:00
if (self) {
self.hostDelegate = delegate;
[[NIMSDK sharedSDK].chatManager addDelegate:self];
2021-10-14 21:10:04 +08:00
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Response
- (void)messageTipsBtnAction:(UIButton *)sender {
self.isPending = NO;
self.messageTipsBtn.hidden = YES;
[self appendAndScrollToBottom];
2021-10-26 19:10:03 +08:00
}
2021-10-14 21:10:04 +08:00
#pragma mark - Private Method
- (void)initSubViews {
2021-10-26 19:10:03 +08:00
[self addSubview:self.messageTableView];
[self addSubview:self.messageTipsBtn];
2021-10-26 19:10:03 +08:00
self.messageTableView.tableHeaderView = self.headerView;
2021-10-14 21:10:04 +08:00
}
- (void)initSubViewConstraints {
2021-10-26 19:10:03 +08:00
[self.messageTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self).offset(15);
make.top.bottom.right.mas_equalTo(self);
}];
[self.messageTipsBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(100);
make.height.mas_equalTo(30);
make.bottom.mas_equalTo(self.mas_bottom).offset(-5);
make.left.mas_equalTo(self);
}];
}
///
- (BOOL)isCurrentRoom:(NSString *)sessionId {
if ([sessionId isEqualToString:[NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]]) {
return YES;
}
return NO;
}
#pragma mark -
///
- (void)addRoomMessage:(NIMMessage *)message {
2021-11-04 16:27:39 +08:00
[self.incomingMessages addObject:message];
if (self.isPending) {
2021-11-04 16:27:39 +08:00
self.messageTipsBtn.hidden = NO;
} else {
[self appendAndScrollToBottom];
2021-11-04 16:27:39 +08:00
}
}
///
- (void)appendAndScrollToBottom {
2021-11-04 16:27:39 +08:00
if (self.incomingMessages.count < 1) {
return;
}
if (self.datasource.count > kRoomMessageMaxLength) {
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, kRoomMessageMaxLength/2)];
NSArray *needRemoveMsgArray = [self.datasource objectsAtIndexes:set];
[self.datasource removeObjectsInArray:needRemoveMsgArray];
}
//
NSMutableArray *indexPaths = [NSMutableArray array];
2021-11-04 16:27:39 +08:00
for (NIMMessage *item in self.incomingMessages) {
[self.datasource addObject:[XPRoomMessageParser parseMessageAttribute:item]];
[indexPaths addObject:[NSIndexPath indexPathForRow:self.datasource.count - 1 inSection:0]];
}
[self.incomingMessages removeAllObjects];
[self.messageTableView reloadData];
//
[self scrollToBottom:YES];
}
///
- (void)scrollToBottom:(BOOL)animated {
NSInteger s = [self.messageTableView numberOfSections]; //
if (s<1) return;
NSInteger r = [self.messageTableView numberOfRowsInSection:s-1]; //
if (r<1) return;
NSIndexPath *ip = [NSIndexPath indexPathForRow:r-1 inSection:s-1]; //
[self.messageTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:animated]; //
}
///
- (BOOL)isCanDisplayMessage:(NIMMessage *)message {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
return [[[self supportMessageDic] objectForKey:@(attachment.first)] containsObject:@(attachment.second)];
}
return NO;
}
- (NSDictionary *)supportMessageDic {
return @{
@(CustomMessageType_ALLMicroSend):
[NSSet setWithObjects:
@(Custom_Message_Sub_AllMicroSend),
@(Custom_Message_Sub_AllMicroLuckySend),
@(Custom_Message_Sub_AllBatchSend),
@(Custom_Message_Sub_AllBatchMicroLuckySend),
nil],
@(CustomMessageType_Gift):
[NSSet setWithObjects:
@(Custom_Message_Sub_Gift_Send),
@(Custom_Message_Sub_Gift_LuckySend),
nil],
};
}
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
for (NIMMessage * message in messages) {
2021-10-29 15:53:44 +08:00
[self handleMessage:message];
}
}
2021-10-29 15:53:44 +08:00
//
- (void)sendMessage:(NIMMessage *)message didCompleteWithError:(NSError *)error {
[self handleMessage:message];
}
- (void)handleMessage:(NIMMessage *)message {
///
if (message.session.sessionType == NIMSessionTypeChatroom && [self isCurrentRoom:message.session.sessionId]) {
if (message.messageType == NIMMessageTypeText || message.messageType == NIMMessageTypeTip) {
[self addRoomMessage:message];
} else if (message.messageType == NIMMessageTypeNotification) {
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
if (content.eventType == NIMChatroomEventTypeEnter) {
[self addRoomMessage:message];
}
2021-10-29 15:53:44 +08:00
}else if (message.messageType == NIMMessageTypeCustom) {//
///TODO :
if ([self isCanDisplayMessage:message]) {
[self addRoomMessage:message];
}
}
2021-10-29 15:53:44 +08:00
} else {
}
}
#pragma mark - ScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
//
self.isPending = YES;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
// decelerate01,DidEndDecelerating
if (!decelerate) {
[self finishDraggingWith:scrollView];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
//
[self finishDraggingWith:scrollView];
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
if (!self.isPending && self.incomingMessages.count <= 0) {
[self scrollToBottom:YES];
}
}
/**
()
*/
- (void)finishDraggingWith:(UIScrollView *)scrollView {
CGFloat contentSizeH = scrollView.contentSize.height;
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGFloat sizeH = scrollView.frame.size.height;
self.isPending = contentSizeH - contentOffsetY - sizeH > 20.0;
if (!self.isPending) {
self.messageTipsBtn.hidden = YES;
if (self.incomingMessages.count > 0) {
[self appendAndScrollToBottom];
}
}
2021-10-26 19:10:03 +08:00
}
2021-10-26 19:10:03 +08:00
#pragma mark - UITableViewDelegate And UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.datasource.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
2021-11-04 16:27:39 +08:00
NSAttributedString* attr = [self.datasource objectAtIndex:indexPath.row];
CGSize maxSize = CGSizeMake(kRoomMessageMaxWidth, MAXFLOAT);
YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:maxSize text:attr];
return layout.textBoundingSize.height + kRoomMessageTextSpaceHeight * 2 + 10;
2021-10-26 19:10:03 +08:00
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
XPRoomMessageTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPRoomMessageTableViewCell class])];
if (cell == nil) {
cell = [[XPRoomMessageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPRoomMessageTableViewCell class])];
}
2021-11-04 16:27:39 +08:00
NSAttributedString* attr = [self.datasource objectAtIndex:indexPath.row];
cell.attributedString = attr;
2021-10-26 19:10:03 +08:00
return cell;
}
#pragma mark - Getters And Setters
- (UITableView *)messageTableView {
if (!_messageTableView) {
_messageTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_messageTableView.delegate = self;
_messageTableView.dataSource = self;
_messageTableView.tableFooterView = [UIView new];
_messageTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_messageTableView.backgroundColor = [UIColor clearColor];
_messageTableView.showsVerticalScrollIndicator = NO;
2021-10-26 19:10:03 +08:00
if (@available(iOS 11.0, *)) {
_messageTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
[_messageTableView registerClass:[XPRoomMessageTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPRoomMessageTableViewCell class])];
}
return _messageTableView;
2021-10-14 21:10:04 +08:00
}
2021-10-26 19:10:03 +08:00
- (XPRoomMessageHeaderView *)headerView {
if (!_headerView) {
_headerView = [[XPRoomMessageHeaderView alloc] init];
}
return _headerView;
}
- (UIButton *)messageTipsBtn {
if (!_messageTipsBtn) {
_messageTipsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[_messageTipsBtn setTitle:@"底部有新消息" forState:UIControlStateNormal];
[_messageTipsBtn setTitleColor:[ThemeColor appMainColor] forState:UIControlStateNormal];
_messageTipsBtn.layer.cornerRadius = 15.0;
_messageTipsBtn.layer.masksToBounds = YES;
_messageTipsBtn.titleLabel.font = [UIFont systemFontOfSize:12.0];
_messageTipsBtn.backgroundColor = [UIColor whiteColor];
[_messageTipsBtn addTarget:self action:@selector(messageTipsBtnAction:) forControlEvents:UIControlEventTouchUpInside];
_messageTipsBtn.hidden = YES;
}
return _messageTipsBtn;
}
2021-11-04 16:27:39 +08:00
- (NSMutableArray<NSAttributedString *> *)datasource {
if (!_datasource) {
_datasource = [NSMutableArray array];
}
return _datasource;
}
2021-11-04 16:27:39 +08:00
- (NSMutableArray<NIMMessage *> *)incomingMessages {
if (!_incomingMessages) {
_incomingMessages = [NSMutableArray array];
}
2021-11-04 16:27:39 +08:00
return _incomingMessages;
}
2021-10-26 19:10:03 +08:00
2021-10-14 21:10:04 +08:00
@end