Fix UICollectionView when receive a new message

This commit is contained in:
Benoit Martins 2023-04-03 17:30:51 +02:00 committed by QuentinArguillere
parent 6a500e19fa
commit 43375e2ab1
3 changed files with 26 additions and 55 deletions

View file

@ -35,7 +35,7 @@ class ChatConversationTableViewModel: ControlsViewModel {
func getMessage(index: Int) -> EventLog? {
if (chatRoom != nil) {
let chatRoomEvents = chatRoom?.getHistoryRangeEvents(begin: index, end: index+1)
let chatRoomEvents = chatRoom?.getHistoryRangeEvents(begin: ChatConversationTableViewModel.sharedModel.getNBMessages() - 1 - index, end: ChatConversationTableViewModel.sharedModel.getNBMessages() - index)
return chatRoomEvents?.first
}else{
return nil
@ -59,7 +59,7 @@ class ChatConversationTableViewModel: ControlsViewModel {
chatRoomEvents?.reversed().forEach({ event in
let chat = event.chatMessage
if (chat != nil && msgId == chat?.messageId) {
index = indexRange ;
index = ChatConversationTableViewModel.sharedModel.getNBMessages() - 1 - indexRange ;
}
indexRange += 1
})

View file

@ -94,7 +94,7 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).estimatedItemSize = UICollectionViewFlowLayout.automaticSize
(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).minimumLineSpacing = 2
collectionView.transform = CGAffineTransform(scaleX: 1, y: -1)
//collectionView.transform = CGAffineTransform(scaleX: 1, y: -1)
}
override func viewWillAppear(_ animated: Bool) {
@ -104,53 +104,33 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
override func viewDidAppear(_ animated: Bool) {
createFloatingButton()
if ChatConversationTableViewModel.sharedModel.getNBMessages() > 0 {
scrollToBottom()
scrollToBottom(animated: false)
}
}
func scrollToMessage(message: ChatMessage){
let messageIndex = ChatConversationTableViewModel.sharedModel.getIndexMessage(message: message)
collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.scrollToItem(at: IndexPath(row: messageIndex, section: 0), at: .top, animated: false)
//Scroll twice because collection view doesn't have time to calculate cell size
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.collectionView.scrollToItem(at: IndexPath(row: messageIndex, section: 0), at: .top, animated: false)
}
}
func scrollToBottom(){
self.collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: false)
func scrollToBottom(animated: Bool){
collectionView.reloadData()
self.collectionView.scrollToItem(at: IndexPath(item: ChatConversationTableViewModel.sharedModel.getNBMessages()-1, section: 0), at: .bottom, animated: false)
//Scroll twice because collection view doesn't have time to calculate cell size
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.collectionView.scrollToItem(at: IndexPath(item: ChatConversationTableViewModel.sharedModel.getNBMessages()-1, section: 0), at: .bottom, animated: animated)
}
ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)
self.floatingScrollButton?.isHidden = true
self.floatingScrollBackground?.isHidden = true
scrollBadge!.text = "0"
}
func scrollToBottomNewMessage(){
self.collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: true)
ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)
self.floatingScrollButton?.isHidden = true
self.floatingScrollBackground?.isHidden = true
scrollBadge!.text = "0"
}
func scrollToBottomWithRelaod(){
if (ChatConversationTableViewModel.sharedModel.getNBMessages() > 1){
let isDisplayingBottomOfTable = collectionView.contentOffset.y <= 20
collectionView.reloadData()
if isDisplayingBottomOfTable {
self.collectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .top, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.scrollToBottomNewMessage()
}
}else{
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.scrollToBottom()
}
}
scrollToBottom(animated: true)
if ChatConversationTableViewModel.sharedModel.editModeOn.value! {
ChatConversationTableViewModel.sharedModel.messageListSelected.value!.insert(false, at: 0)
}
@ -162,22 +142,15 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
func refreshData(){
if (ChatConversationTableViewModel.sharedModel.getNBMessages() > 1){
let indexBottom = collectionView.indexPathsForVisibleItems.sorted().first?.row
let isDisplayingBottomOfTable = collectionView.contentOffset.y <= 20
let sizeCell = (self.collectionView.cellForItem(at: IndexPath(row: indexBottom!, section: 0))?.frame.size.height)
collectionView.reloadData()
let isDisplayingBottomOfTable = collectionView.contentOffset.y >= (collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom) - 20
if isDisplayingBottomOfTable {
self.collectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .top, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.scrollToBottomNewMessage()
}
scrollToBottom(animated: true)
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: self.collectionView.contentOffset.y + sizeCell! + 2.0)
}
collectionView.reloadData()
scrollBadge!.isHidden = false
scrollBadge!.text = "\(ChatConversationViewModel.sharedModel.chatRoom?.unreadMessagesCount ?? 0)"
}
if ChatConversationTableViewModel.sharedModel.editModeOn.value! {
ChatConversationTableViewModel.sharedModel.messageListSelected.value!.insert(false, at: 0)
@ -189,16 +162,16 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffsetY = scrollView.contentOffset.y
if contentOffsetY <= 20 /* Needed offset */ {
self.floatingScrollButton?.isHidden = true
self.floatingScrollBackground?.isHidden = true
self.scrollBadge?.text = "0"
if contentOffsetY >= (collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom) - 20{
floatingScrollButton?.isHidden = true
floatingScrollBackground?.isHidden = true
scrollBadge?.text = "0"
ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)
} else {
self.floatingScrollButton?.isHidden = false
self.floatingScrollBackground?.isHidden = false;
if(self.scrollBadge?.text == "0"){
self.scrollBadge?.isHidden = true
floatingScrollButton?.isHidden = false
floatingScrollBackground?.isHidden = false;
if(scrollBadge?.text == "0"){
scrollBadge?.isHidden = true
}
}
}
@ -239,9 +212,8 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
}
}
}
cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1)
//cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1)
return cell
}

View file

@ -1449,7 +1449,6 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI
}
})
} else {
print("indexUploadTransferProgressindexUploadTransferProgress \(indexUploadTransferProgress)")
if((chatMessage?.contents.count)! > 1){
DispatchQueue.main.async(execute: { [self] in
if (offset == total) {
@ -1498,8 +1497,8 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI
func isFirstIndexInTableView(indexPath: IndexPath, chat: ChatMessage) -> Bool{
let MAX_AGGLOMERATED_TIME=300
var previousEvent : EventLog? = nil
let indexOfPreviousEvent = indexPath.row + 1
previousEvent = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row+1)
let indexOfPreviousEvent = indexPath.row - 1
previousEvent = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row-1)
if (indexOfPreviousEvent > -1 && indexOfPreviousEvent < ChatConversationTableViewModel.sharedModel.getNBMessages()) {
if ((previousEvent?.type.rawValue)! != LinphoneEventLogTypeConferenceChatMessage.rawValue) {
return true