From 04a5eb17357ca29013c3ef150e4bfee27eb30e14 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Fri, 8 Mar 2019 15:52:01 -0500 Subject: [PATCH] Maintain relative scroll position on resize --- Persephone/Controllers/AlbumViewController.swift | 9 +++++++++ Persephone/Layouts/AlbumViewLayout.swift | 12 ++++++++++++ Persephone/Views/AlbumItemView.swift | 6 +++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Persephone/Controllers/AlbumViewController.swift b/Persephone/Controllers/AlbumViewController.swift index 42bec54..21ee848 100644 --- a/Persephone/Controllers/AlbumViewController.swift +++ b/Persephone/Controllers/AlbumViewController.swift @@ -44,6 +44,15 @@ class AlbumViewController: NSViewController, albumCollectionView.collectionViewLayout?.invalidateLayout() } + override func viewDidLayout() { + super.viewDidLayout() + + guard let layout = albumCollectionView.collectionViewLayout as? AlbumViewLayout + else { return } + + layout.setScrollPosition() + } + @objc func updateAlbums(_ notification: Notification) { guard let albums = notification.userInfo?[Notification.albumsKey] as? [MPDClient.Album] else { return } diff --git a/Persephone/Layouts/AlbumViewLayout.swift b/Persephone/Layouts/AlbumViewLayout.swift index aaf9c6f..5a93b65 100644 --- a/Persephone/Layouts/AlbumViewLayout.swift +++ b/Persephone/Layouts/AlbumViewLayout.swift @@ -11,6 +11,7 @@ import Cocoa class AlbumViewLayout: NSCollectionViewFlowLayout { let maxItemWidth: CGFloat = 180 let albumInfoHeight: CGFloat = 39 + var scrollPosition: CGFloat = 0 required init?(coder aDecoder: NSCoder) { super.init() @@ -35,6 +36,10 @@ class AlbumViewLayout: NSCollectionViewFlowLayout { var divider: CGFloat = 1 var itemWidth: CGFloat = 0 + if let scrollView = collectionView.enclosingScrollView { + scrollPosition = scrollView.documentVisibleRect.minY / collectionView.bounds.height + } + repeat { let totalPaddingWidth = sectionInset.left + sectionInset.right let totalGutterWidth = (divider - 1) * (minimumInteritemSpacing) @@ -46,4 +51,11 @@ class AlbumViewLayout: NSCollectionViewFlowLayout { itemSize = NSSize(width: itemWidth, height: itemHeight) } + + func setScrollPosition() { + guard let collectionView = collectionView + else { return } + + collectionView.scroll(NSPoint(x: 0, y: scrollPosition * collectionView.bounds.height)) + } } diff --git a/Persephone/Views/AlbumItemView.swift b/Persephone/Views/AlbumItemView.swift index dca1eb0..06162f0 100644 --- a/Persephone/Views/AlbumItemView.swift +++ b/Persephone/Views/AlbumItemView.swift @@ -43,7 +43,7 @@ class AlbumItemView: NSView { NotificationCenter.default.addObserver( self, - selector: #selector(viewWillScroll(_:)), + selector: #selector(viewDidScroll(_:)), name: NSScrollView.didLiveScrollNotification, object: nil ) @@ -59,6 +59,10 @@ class AlbumItemView: NSView { hidePlayButton() } + @objc func viewDidScroll(_ notification: Notification) { + viewWillScroll(notification) + } + override func resize(withOldSuperviewSize oldSize: NSSize) { hidePlayButton() }