diff --git a/Mastodon/Protocol/LoadMoreConfigurableTableViewContainer.swift b/Mastodon/Protocol/LoadMoreConfigurableTableViewContainer.swift index bc90ab1e..4f32be54 100644 --- a/Mastodon/Protocol/LoadMoreConfigurableTableViewContainer.swift +++ b/Mastodon/Protocol/LoadMoreConfigurableTableViewContainer.swift @@ -23,6 +23,13 @@ extension LoadMoreConfigurableTableViewContainer { func handleScrollViewDidScroll(_ scrollView: UIScrollView) { guard scrollView === loadMoreConfigurableTableView else { return } + // check if current scroll position is the bottom of table + let contentOffsetY = loadMoreConfigurableTableView.contentOffset.y + let bottomVisiblePageContentOffsetY = loadMoreConfigurableTableView.contentSize.height - (1.5 * loadMoreConfigurableTableView.visibleSize.height) + guard contentOffsetY > bottomVisiblePageContentOffsetY else { + return + } + let cells = loadMoreConfigurableTableView.visibleCells.compactMap { $0 as? BottomLoaderTableViewCell } guard let loaderTableViewCell = cells.first else { return } diff --git a/Mastodon/Scene/HomeTimeline/HomeTimelineViewController.swift b/Mastodon/Scene/HomeTimeline/HomeTimelineViewController.swift index 153f4613..906708fa 100644 --- a/Mastodon/Scene/HomeTimeline/HomeTimelineViewController.swift +++ b/Mastodon/Scene/HomeTimeline/HomeTimelineViewController.swift @@ -175,23 +175,17 @@ extension HomeTimelineViewController { // MARK: - UIScrollViewDelegate extension HomeTimelineViewController { func scrollViewDidScroll(_ scrollView: UIScrollView) { - guard scrollView === tableView else { return } - let cells = tableView.visibleCells.compactMap { $0 as? TimelineBottomLoaderTableViewCell } - guard let loaderTableViewCell = cells.first else { return } - - if let tabBar = tabBarController?.tabBar, let window = view.window { - let loaderTableViewCellFrameInWindow = tableView.convert(loaderTableViewCell.frame, to: nil) - let windowHeight = window.frame.height - let loaderAppear = (loaderTableViewCellFrameInWindow.origin.y + 0.8 * loaderTableViewCell.frame.height) < (windowHeight - tabBar.frame.height) - if loaderAppear { - viewModel.loadoldestStateMachine.enter(HomeTimelineViewModel.LoadOldestState.Loading.self) - } - } else { - viewModel.loadoldestStateMachine.enter(HomeTimelineViewModel.LoadOldestState.Loading.self) - } + handleScrollViewDidScroll(scrollView) } } +extension HomeTimelineViewController: LoadMoreConfigurableTableViewContainer { + typealias BottomLoaderTableViewCell = TimelineBottomLoaderTableViewCell + typealias LoadingState = HomeTimelineViewModel.LoadOldestState.Loading + var loadMoreConfigurableTableView: UITableView { return tableView } + var loadMoreConfigurableStateMachine: GKStateMachine { return viewModel.loadoldestStateMachine } +} + // MARK: - UITableViewDelegate extension HomeTimelineViewController: UITableViewDelegate {