From 217e4dad3823b8961a28c53d67e1d8d9657c8290 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 10 Feb 2021 11:55:50 +1100 Subject: [PATCH] Fix paging --- Session/Conversations V2/ConversationVC.swift | 38 +++++++++++-------- Session/Conversations/ConversationViewModel.m | 4 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Session/Conversations V2/ConversationVC.swift b/Session/Conversations V2/ConversationVC.swift index c594651b0..7e11ffb21 100644 --- a/Session/Conversations V2/ConversationVC.swift +++ b/Session/Conversations V2/ConversationVC.swift @@ -19,22 +19,23 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD var contextMenuWindow: ContextMenuWindow? var contextMenuVC: ContextMenuVC? // Scrolling & paging - private var isUserScrolling = false { didSet { autoLoadMoreIfNeeded() } } + private var isUserScrolling = false private var hasPerformedInitialScroll = false private var isLoadingMore = false - private var contentOffsetYBeforeUpdate: CGFloat? - private var contentHeightBeforeUpdate: CGFloat? - + private var scrollDistanceToBottomBeforeUpdate: CGFloat? private var dbConnection: YapDatabaseConnection { OWSPrimaryStorage.shared().uiDatabaseConnection } var viewItems: [ConversationViewItem] { viewModel.viewState.viewItems } func conversationStyle() -> ConversationStyle { return ConversationStyle(thread: thread) } override var inputAccessoryView: UIView? { snInputView } override var canBecomeFirstResponder: Bool { true } - + + private var tableViewUnobscuredHeight: CGFloat { + let bottomInset = messagesTableView.adjustedContentInset.bottom + ConversationVC.bottomInset + return messagesTableView.bounds.height - bottomInset + } + private var lastPageTop: CGFloat { - let bottomInset = -messagesTableView.adjustedContentInset.bottom - ConversationVC.bottomInset - let tableViewUnobscuredHeight = messagesTableView.bounds.height + bottomInset return messagesTableView.contentSize.height - tableViewUnobscuredHeight } @@ -250,14 +251,14 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD } func conversationViewModelWillLoadMoreItems() { - contentHeightBeforeUpdate = messagesTableView.contentSize.height - contentOffsetYBeforeUpdate = messagesTableView.contentOffset.y + view.layoutIfNeeded() + scrollDistanceToBottomBeforeUpdate = messagesTableView.contentSize.height - messagesTableView.contentOffset.y } func conversationViewModelDidLoadMoreItems() { - guard let contentHeightBeforeUpdate = contentHeightBeforeUpdate, let contentOffsetYBeforeUpdate = contentOffsetYBeforeUpdate else { return } + guard let scrollDistanceToBottomBeforeUpdate = scrollDistanceToBottomBeforeUpdate else { return } view.layoutIfNeeded() - messagesTableView.contentOffset.y = (messagesTableView.contentSize.height - contentHeightBeforeUpdate + contentOffsetYBeforeUpdate) + messagesTableView.contentOffset.y = messagesTableView.contentSize.height - scrollDistanceToBottomBeforeUpdate isLoadingMore = false } @@ -274,6 +275,14 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD } // MARK: General + func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + } + func getMediaCache() -> NSCache { return mediaCache } @@ -291,9 +300,9 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD // Ensure the view is fully up to date before we try to scroll to the bottom, since // we use the table view's bounds to determine where the bottom is. view.layoutIfNeeded() - let firstContentPageTop = -messagesTableView.adjustedContentInset.top - let destinationY = max(firstContentPageTop, lastPageTop) - messagesTableView.setContentOffset(CGPoint(x: 0, y: destinationY), animated: isAnimated) + let firstContentPageTop: CGFloat = 0 + let contentOffsetY = max(firstContentPageTop, lastPageTop) + messagesTableView.setContentOffset(CGPoint(x: 0, y: contentOffsetY), animated: isAnimated) // TODO: Did scroll to bottom } @@ -315,7 +324,6 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD guard isMainAppAndActive && viewModel.canLoadMoreItems() && !isLoadingMore && messagesTableView.contentOffset.y < ConversationVC.loadMoreThreshold else { return } isLoadingMore = true - print("[Test] LOAD MORE") viewModel.loadAnotherPageOfMessages() } diff --git a/Session/Conversations/ConversationViewModel.m b/Session/Conversations/ConversationViewModel.m index 729a98b86..abf3aa0b1 100644 --- a/Session/Conversations/ConversationViewModel.m +++ b/Session/Conversations/ConversationViewModel.m @@ -166,12 +166,12 @@ NS_ASSUME_NONNULL_BEGIN // Always load up to n messages when user arrives. // // The smaller this number is, the faster the conversation can display. -// To test, shrink you accessability font as much as possible, then count how many 1-line system info messages (our +// To test, shrink you accessibility font as much as possible, then count how many 1-line system info messages (our // shortest cells) can fit on screen at a time on an iPhoneX // // PERF: we could do less messages on shorter (older, slower) devices // PERF: we could cache the cell height, since some messages will be much taller. -static const int kYapDatabasePageSize = 18; +static const int kYapDatabasePageSize = 64; // Never show more than n messages in conversation view when user arrives. static const int kConversationInitialMaxRangeSize = 300;