tableview倒置

This commit is contained in:
2026-01-31 22:40:50 +08:00
parent d2f582b7f8
commit 6ae504823b
35 changed files with 2340 additions and 128 deletions

View File

@@ -260,7 +260,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
__weak typeof(self) weakSelf = self;
[self.aiVM fetchChatHistoryWithCompanionId:companionId
pageNum:self.currentPage
pageSize:20
pageSize:10
completion:^(KBChatHistoryPageModel *pageModel, NSError *error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
@@ -304,8 +304,8 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
message.isComplete = YES;
message.needsTypewriterEffect = NO;
// [newMessages addObject:message];
[newMessages insertObject:message atIndex:0];
[newMessages addObject:message];
// [newMessages insertObject:message atIndex:0];
}
//
@@ -317,12 +317,19 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
strongSelf.messages = newMessages;
[strongSelf ensureOpeningMessageAtTop];
} else {
//
//
[strongSelf ensureOpeningMessageAtTop];
if (newMessages.count > 0) {
NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0;
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
if (strongSelf.chatView.inverted) {
NSInteger openingIndex = [strongSelf openingMessageIndexInMessages];
NSUInteger insertIndex = (openingIndex != NSNotFound) ? (NSUInteger)openingIndex : strongSelf.messages.count;
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
} else {
NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0;
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
}
}
}
@@ -335,10 +342,16 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
keepOffset:NO
scrollToBottom:YES];
} else {
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory",
(long)loadedPage);
KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil;
[strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage];
if (strongSelf.chatView.inverted) {
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, appendHistory", (long)loadedPage);
KBAiChatMessage *openingMessage = [strongSelf openingMessageInMessages];
[strongSelf.chatView appendHistoryMessages:newMessages openingMessage:openingMessage];
} else {
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory",
(long)loadedPage);
KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil;
[strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage];
}
}
[strongSelf.chatView endLoadMoreWithHasMoreData:strongSelf.hasMoreHistory];
@@ -381,6 +394,9 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
if (self.messages.count == 0) {
return NO;
}
if (self.chatView.inverted) {
return [self isOpeningMessage:self.messages.lastObject];
}
return [self isOpeningMessage:self.messages.firstObject];
}
@@ -409,7 +425,35 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
KBAiChatMessage *openingMsg = [KBAiChatMessage assistantMessageWithText:introText];
openingMsg.isComplete = YES;
openingMsg.needsTypewriterEffect = NO;
[self.messages insertObject:openingMsg atIndex:0];
if (self.chatView.inverted) {
[self.messages addObject:openingMsg];
} else {
[self.messages insertObject:openingMsg atIndex:0];
}
}
- (nullable KBAiChatMessage *)openingMessageInMessages {
NSInteger index = [self openingMessageIndexInMessages];
if (index == NSNotFound) {
return nil;
}
return self.messages[index];
}
- (NSInteger)openingMessageIndexInMessages {
NSString *introText = self.persona.introText ?: @"";
if (introText.length == 0 || self.messages.count == 0) {
return NSNotFound;
}
if (self.chatView.inverted) {
NSInteger lastIndex = self.messages.count - 1;
KBAiChatMessage *msg = self.messages[lastIndex];
return [self isOpeningMessage:msg] ? lastIndex : NSNotFound;
}
KBAiChatMessage *first = self.messages.firstObject;
return [self isOpeningMessage:first] ? 0 : NSNotFound;
}
#pragma mark -
@@ -454,7 +498,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[self ensureOpeningMessageAtTop];
KBAiChatMessage *message = [KBAiChatMessage userMessageWithText:text];
[self.messages addObject:message];
if (self.chatView.inverted) {
[self.messages insertObject:message atIndex:0];
} else {
[self.messages addObject:message];
}
[self.chatView addMessage:message autoScroll:YES];
}
@@ -465,7 +513,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[self ensureOpeningMessageAtTop];
KBAiChatMessage *message = [KBAiChatMessage loadingUserMessage];
[self.messages addObject:message];
if (self.chatView.inverted) {
[self.messages insertObject:message atIndex:0];
} else {
[self.messages addObject:message];
}
[self.chatView addMessage:message autoScroll:YES];
}
@@ -473,13 +525,25 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[self.chatView updateLastUserMessage:text];
//
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.text = text;
message.isLoading = NO;
message.isComplete = YES;
break;
if (self.chatView.inverted) {
for (NSInteger i = 0; i < self.messages.count; i++) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.text = text;
message.isLoading = NO;
message.isComplete = YES;
break;
}
}
} else {
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.text = text;
message.isLoading = NO;
message.isComplete = YES;
break;
}
}
}
}
@@ -488,11 +552,21 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[self.chatView markLastUserMessageLoadingComplete];
//
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.isLoading = NO;
break;
if (self.chatView.inverted) {
for (NSInteger i = 0; i < self.messages.count; i++) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.isLoading = NO;
break;
}
}
} else {
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
message.isLoading = NO;
break;
}
}
}
}
@@ -515,7 +589,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
KBAiChatMessage *message = [KBAiChatMessage assistantMessageWithText:text
audioId:audioId];
message.needsTypewriterEffect = YES;
[self.messages addObject:message];
if (self.chatView.inverted) {
[self.messages insertObject:message atIndex:0];
} else {
[self.messages addObject:message];
}
[self.chatView addMessage:message autoScroll:YES];
}
@@ -527,18 +605,32 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[self ensureOpeningMessageAtTop];
KBAiChatMessage *message = [KBAiChatMessage loadingAssistantMessage];
[self.messages addObject:message];
if (self.chatView.inverted) {
[self.messages insertObject:message atIndex:0];
} else {
[self.messages addObject:message];
}
[self.chatView addMessage:message autoScroll:YES];
}
/// loading AI
- (void)removeLoadingAssistantMessage {
//
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
[self.messages removeObjectAtIndex:i];
break;
if (self.chatView.inverted) {
for (NSInteger i = 0; i < self.messages.count; i++) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
[self.messages removeObjectAtIndex:i];
break;
}
}
} else {
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
KBAiChatMessage *message = self.messages[i];
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
[self.messages removeObjectAtIndex:i];
break;
}
}
}
@@ -556,7 +648,22 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
scrollView:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
//
if (chatView.inverted) {
CGFloat contentHeight = scrollView.contentSize.height;
CGFloat scrollViewHeight = scrollView.bounds.size.height;
CGFloat maxOffsetY = contentHeight - scrollViewHeight + scrollView.contentInset.bottom;
if (maxOffsetY < 0) {
maxOffsetY = 0;
}
if (offsetY >= maxOffsetY - 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) {
self.canTriggerLoadMore = NO;
[self loadMoreHistory];
} else if (offsetY < maxOffsetY - 100) {
self.canTriggerLoadMore = YES;
}
return;
}
if (offsetY <= 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) {
self.canTriggerLoadMore = NO;
[self loadMoreHistory];
@@ -622,6 +729,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
if (!_chatView) {
_chatView = [[KBChatTableView alloc] init];
_chatView.backgroundColor = [UIColor clearColor];
_chatView.inverted = YES;
_chatView.delegate = self;
}
return _chatView;