Save and restore scroll position when transitioning between three column mode and normal. Issue #1242
This commit is contained in:
parent
2617744d49
commit
766cd2f868
|
@ -25,6 +25,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
|
||||||
|
|
||||||
weak var coordinator: SceneCoordinator!
|
weak var coordinator: SceneCoordinator!
|
||||||
var undoableCommands = [UndoableCommand]()
|
var undoableCommands = [UndoableCommand]()
|
||||||
|
let scrollPositionQueue = CoalescingQueue(name: "Scroll Position", interval: 0.3, maxInterval: 1.0)
|
||||||
|
|
||||||
private let keyboardManager = KeyboardManager(type: .timeline)
|
private let keyboardManager = KeyboardManager(type: .timeline)
|
||||||
override var keyCommands: [UIKeyCommand]? {
|
override var keyCommands: [UIKeyCommand]? {
|
||||||
|
@ -73,6 +74,13 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
|
||||||
|
|
||||||
override func viewWillAppear(_ animated: Bool) {
|
override func viewWillAppear(_ animated: Bool) {
|
||||||
applyChanges(animate: false)
|
applyChanges(animate: false)
|
||||||
|
|
||||||
|
// Restore the scroll position if we have one stored
|
||||||
|
if let restoreIndexPath = coordinator.timelineMiddleIndexPath {
|
||||||
|
tableView.scrollToRow(at: restoreIndexPath, at: .middle, animated: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide the search controller if we don't have any rows
|
||||||
if dataSource.snapshot().numberOfItems < 1 {
|
if dataSource.snapshot().numberOfItems < 1 {
|
||||||
navigationItem.searchController?.isActive = false
|
navigationItem.searchController?.isActive = false
|
||||||
}
|
}
|
||||||
|
@ -288,6 +296,10 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
|
||||||
coordinator.selectArticle(article, animated: true)
|
coordinator.selectArticle(article, animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||||
|
scrollPositionQueue.add(self, #selector(scrollPositionDidChange))
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: Notifications
|
// MARK: Notifications
|
||||||
|
|
||||||
@objc dynamic func unreadCountDidChange(_ notification: Notification) {
|
@objc dynamic func unreadCountDidChange(_ notification: Notification) {
|
||||||
|
@ -366,6 +378,10 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
|
||||||
titleView?.label.text = coordinator.timelineName
|
titleView?.label.text = coordinator.timelineName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc func scrollPositionDidChange() {
|
||||||
|
coordinator.timelineMiddleIndexPath = tableView.middleVisibleRow()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: Reloading
|
// MARK: Reloading
|
||||||
|
|
||||||
func queueReloadAvailableCells() {
|
func queueReloadAvailableCells() {
|
||||||
|
|
|
@ -135,6 +135,8 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider {
|
||||||
var timelineFetcher: ArticleFetcher? {
|
var timelineFetcher: ArticleFetcher? {
|
||||||
didSet {
|
didSet {
|
||||||
|
|
||||||
|
timelineMiddleIndexPath = nil
|
||||||
|
|
||||||
if timelineFetcher is Feed {
|
if timelineFetcher is Feed {
|
||||||
showFeedNames = false
|
showFeedNames = false
|
||||||
} else {
|
} else {
|
||||||
|
@ -153,6 +155,8 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var timelineMiddleIndexPath: IndexPath?
|
||||||
|
|
||||||
private(set) var showFeedNames = false
|
private(set) var showFeedNames = false
|
||||||
private(set) var showIcons = false
|
private(set) var showIcons = false
|
||||||
|
|
||||||
|
@ -529,7 +533,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
func selectFeed(_ indexPath: IndexPath?, animated: Bool = false) {
|
func selectFeed(_ indexPath: IndexPath?, animated: Bool = false) {
|
||||||
guard indexPath != currentFeedIndexPath else { return }
|
guard indexPath != currentFeedIndexPath else { return }
|
||||||
|
|
||||||
selectArticle(nil)
|
selectArticle(nil)
|
||||||
currentFeedIndexPath = indexPath
|
currentFeedIndexPath = indexPath
|
||||||
|
@ -1589,7 +1593,7 @@ private extension SceneCoordinator {
|
||||||
subSplitViewController!.showDetailViewController(navController, sender: self)
|
subSplitViewController!.showDetailViewController(navController, sender: self)
|
||||||
|
|
||||||
masterFeedViewController.restoreSelectionIfNecessary(adjustScroll: true)
|
masterFeedViewController.restoreSelectionIfNecessary(adjustScroll: true)
|
||||||
masterTimelineViewController!.restoreSelectionIfNecessary(adjustScroll: true)
|
masterTimelineViewController!.restoreSelectionIfNecessary(adjustScroll: false)
|
||||||
|
|
||||||
// We made sure this was there above when we called configureDoubleSplit
|
// We made sure this was there above when we called configureDoubleSplit
|
||||||
return subSplitViewController!
|
return subSplitViewController!
|
||||||
|
|
Loading…
Reference in New Issue