[IOS-3869] Fix toolbar overlapping content in All Media.

This commit is contained in:
Igor Solomennikov 2023-06-22 13:06:59 -07:00 committed by GitHub
parent f94012fff8
commit 72bf7ee197
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 54 deletions

View File

@ -20,6 +20,7 @@ fileprivate extension AllMediaFileType {
}
protocol MediaGalleryPrimaryViewController: UIViewController {
var scrollView: UIScrollView { get }
var mediaGalleryFilterMenuActions: [MediaGalleryAccessoriesHelper.MenuAction] { get }
var isFiltering: Bool { get }
var isEmpty: Bool { get }
@ -29,18 +30,12 @@ protocol MediaGalleryPrimaryViewController: UIViewController {
func didEndSelectMode()
func deleteSelectedItems()
func shareSelectedItems(_ sender: Any)
func mediaGalleryAccessoriesHelperToolbarHeightWillChange(to height: CGFloat)
@available(iOS 13, *)
var fileType: AllMediaFileType { get }
@available(iOS 13, *)
func set(fileType: AllMediaFileType, grid: Bool)
}
public class MediaGalleryAccessoriesHelper: NSObject {
private var footerBarBottomConstraint: NSLayoutConstraint!
let kFooterBarHeight: CGFloat = 40
private var footerBarBottomConstraint: NSLayoutConstraint?
weak var viewController: MediaGalleryPrimaryViewController?
private enum Mode {
@ -124,9 +119,11 @@ public class MediaGalleryAccessoriesHelper: NSObject {
}
}
func add(toView view: UIView) {
view.addSubview(footerBar)
if let viewController, let headerView {
func installViews() {
guard let viewController else { return }
viewController.view.addSubview(footerBar)
if let headerView {
headerView.sizeToFit()
var frame = headerView.frame
frame.size.width += CGFloat(AllMediaFileType.allCases.count) * 20.0
@ -134,8 +131,6 @@ public class MediaGalleryAccessoriesHelper: NSObject {
viewController.navigationItem.titleView = headerView
}
footerBar.autoPinWidthToSuperview()
footerBar.autoSetDimension(.height, toSize: kFooterBarHeight)
footerBarBottomConstraint = footerBar.autoPinEdge(toSuperviewEdge: .bottom, withInset: -kFooterBarHeight)
updateDeleteButton()
updateSelectButton()
}
@ -422,10 +417,7 @@ public class MediaGalleryAccessoriesHelper: NSObject {
// MARK: - Footer
private lazy var footerBar: UIToolbar = {
let footerBar = UIToolbar()
return footerBar
}()
private lazy var footerBar = UIToolbar()
enum FooterBarState {
// No footer bar.
@ -450,15 +442,14 @@ public class MediaGalleryAccessoriesHelper: NSObject {
let wasHidden = footerBarState == .hidden
let willBeHidden = newValue == .hidden
if wasHidden && !willBeHidden {
showToolbar()
showToolbar(animated: footerBar.window != nil)
} else if !wasHidden && willBeHidden {
hideToolbar()
hideToolbar(animated: footerBar.window != nil)
}
}
didSet {
reloadFooter()
}
}
private var gridViewAllowed: Bool {
@ -546,49 +537,55 @@ public class MediaGalleryAccessoriesHelper: NSObject {
// MARK: - Toolbar
private func showToolbar() {
viewController?.mediaGalleryAccessoriesHelperToolbarHeightWillChange(to: footerBar.frame.height)
UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseInOut, animations: {
private func showToolbar(animated: Bool) {
guard animated else {
_showToolbar()
return
}
UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut) {
self._showToolbar()
}, completion: nil)
}
}
private func _showToolbar() {
guard let viewController else {
return
}
NSLayoutConstraint.deactivate([self.footerBarBottomConstraint])
guard let viewController else { return }
self.footerBarBottomConstraint = self.footerBar.autoPin(toBottomLayoutGuideOf: viewController, withInset: 0)
self.footerBar.superview?.layoutIfNeeded()
// ensure toolbar doesn't cover bottom row.
if let scrollView = viewController.view as? UIScrollView {
scrollView.contentInset.bottom += self.kFooterBarHeight
scrollView.verticalScrollIndicatorInsets.bottom += self.kFooterBarHeight
if let footerBarBottomConstraint {
NSLayoutConstraint.deactivate([footerBarBottomConstraint])
}
footerBarBottomConstraint = footerBar.autoPin(toBottomLayoutGuideOf: viewController, withInset: 0)
viewController.view.layoutIfNeeded()
let bottomInset = viewController.view.bounds.maxY - footerBar.frame.minY
viewController.scrollView.contentInset.bottom = bottomInset
viewController.scrollView.verticalScrollIndicatorInsets.bottom = bottomInset
}
private func hideToolbar() {
viewController?.mediaGalleryAccessoriesHelperToolbarHeightWillChange(to: 0.0)
UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseInOut, animations: {
private func hideToolbar(animated: Bool) {
guard animated else {
_hideToolbar()
return
}
UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut) {
self._hideToolbar()
}, completion: nil)
}
}
private func _hideToolbar() {
guard let viewController else {
return
}
NSLayoutConstraint.deactivate([self.footerBarBottomConstraint])
self.footerBarBottomConstraint = self.footerBar.autoPinEdge(toSuperviewEdge: .bottom, withInset: -self.kFooterBarHeight)
self.footerBar.superview?.layoutIfNeeded()
guard let viewController else { return }
// Undo "ensure toolbar doesn't cover bottom row.".
if let scrollView = viewController.view as? UIScrollView {
scrollView.contentInset.bottom -= self.kFooterBarHeight
scrollView.verticalScrollIndicatorInsets.bottom -= self.kFooterBarHeight
if let footerBarBottomConstraint {
NSLayoutConstraint.deactivate([footerBarBottomConstraint])
}
footerBarBottomConstraint = footerBar.autoPinEdge(.top, to: .bottom, of: viewController.view)
viewController.view.layoutIfNeeded()
viewController.scrollView.contentInset.bottom = 0
viewController.scrollView.verticalScrollIndicatorInsets.bottom = 0
}
// MARK: - Delete

View File

@ -151,7 +151,6 @@ public class MediaTileViewController: UICollectionViewController, MediaGalleryDe
}
}
private var mode = Mode.grid
private var toolbarHeight = CGFloat(0)
public init(
thread: TSThread,
@ -253,7 +252,7 @@ public class MediaTileViewController: UICollectionViewController, MediaGalleryDe
collectionView.delegate = self
accessoriesHelper.add(toView: self.view)
accessoriesHelper.installViews()
self.mediaTileViewLayout.invalidateLayout()
@ -1231,6 +1230,8 @@ extension MediaGalleryItem {
extension MediaTileViewController: MediaGalleryPrimaryViewController {
typealias MenuAction = MediaGalleryAccessoriesHelper.MenuAction
var scrollView: UIScrollView { return collectionView }
var isFiltering: Bool {
return mediaGallery.allowedMediaType != MediaGalleryFinder.MediaType.defaultMediaType(for: fileType)
}
@ -1361,10 +1362,6 @@ extension MediaTileViewController: MediaGalleryPrimaryViewController {
AttachmentSharing.showShareUI(for: items, sender: sender)
}
func mediaGalleryAccessoriesHelperToolbarHeightWillChange(to height: CGFloat) {
toolbarHeight = height
}
}
class MediaTileCollectionView: UICollectionView {