Merge branch 'mkirk/scroll-to-bottom-when-switching-albums'

pull/1/head
Michael Kirk 7 years ago
commit 2df6ae2cfd

@ -116,13 +116,14 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
reloadDataAndRestoreSelection() reloadDataAndRestoreSelection()
if !hasEverAppeared { if !hasEverAppeared {
hasEverAppeared = true
scrollToBottom(animated: false) scrollToBottom(animated: false)
} }
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
hasEverAppeared = true
// done button may have been disable from the last time we hit "Done" // done button may have been disable from the last time we hit "Done"
// make sure to re-enable it if appropriate upon returning to the view // make sure to re-enable it if appropriate upon returning to the view
hasPressedDoneSinceAppeared = false hasPressedDoneSinceAppeared = false
@ -156,31 +157,37 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
return return
} }
let verticalOffset: CGFloat var verticalOffset: CGFloat
if #available(iOS 11, *) {
// On iOS10 and earlier, we can be precise, but as of iOS11 `collectionView.contentInset` let visibleHeight = collectionView.bounds.height - collectionView.contentInset.top
// is based on `safeAreaInsets`, which isn't accurate until `viewDidAppear` at the earliest. let contentHeight = collectionView.contentSize.height
// if contentHeight <= visibleHeight {
// from https://developer.apple.com/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area verticalOffset = -collectionView.contentInset.top
// > Make your modifications in [viewDidAppear] because the safe area insets for a view are
// > not accurate until the view is added to a view hierarchy.
//
// Overshooting like this works without visible animation glitch. on iOS11+
// However, before iOS11, "overshooting" the contentOffset like this produces a broken
// layout or hanging. Luckily for those versions, before the safeAreaInset feature
// existed, we can accurately accesse colletionView.contentInset before `viewDidAppear`
// and calculate a precise content offset.
verticalOffset = CGFloat.greatestFiniteMagnitude
} else { } else {
let visibleHeight = collectionView.bounds.height - collectionView.contentInset.top let topOfLastPage = contentHeight - collectionView.bounds.height
let contentHeight = collectionView.contentSize.height verticalOffset = topOfLastPage
if contentHeight <= visibleHeight { }
verticalOffset = -collectionView.contentInset.top
if #available(iOS 11, *) {
if hasEverAppeared {
verticalOffset += collectionView.safeAreaInsets.bottom
} else { } else {
let topOfLastPage = contentHeight - collectionView.bounds.height // On iOS10 and earlier, we can be precise, but as of iOS11 `collectionView.contentInset`
verticalOffset = topOfLastPage // is based on `safeAreaInsets`, which isn't accurate until `viewDidAppear` at the earliest.
//
// from https://developer.apple.com/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area
// > Make your modifications in [viewDidAppear] because the safe area insets for a view are
// > not accurate until the view is added to a view hierarchy.
//
// Overshooting like this works without visible animation glitch. on iOS11+
// However, before iOS11, "overshooting" the contentOffset like this produces a broken
// layout or hanging. Luckily for those versions, before the safeAreaInset feature
// existed, we can accurately access collectionView.contentInset before `viewDidAppear`
// and calculate a precise content offset.
verticalOffset += 122
} }
} }
collectionView.setContentOffset(CGPoint(x: 0, y: verticalOffset), animated: animated) collectionView.setContentOffset(CGPoint(x: 0, y: verticalOffset), animated: animated)
} }
@ -478,6 +485,7 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
} }
collectionView?.reloadData() collectionView?.reloadData()
scrollToBottom(animated: false)
hideCollectionPicker() hideCollectionPicker()
} }

Loading…
Cancel
Save