Explorar o código

EditToolbar: Show toolbar on top of the navigation tab bar

This move the EditToolbar inside the TabBarCoordinator in order to show
it on top of the tab bar.

Additionally, this will avoid creating the toolbar n times,
n being the number of MediaCategoryViewControllers we have.
Soomin Lee %!s(int64=5) %!d(string=hai) anos
pai
achega
19dba7fd23

+ 0 - 6
Sources/EditController.swift

@@ -26,12 +26,6 @@ class EditController: UIViewController {
 
     weak var delegate: EditControllerDelegate?
 
-    override func loadView() {
-        let editToolbar = EditToolbar(model: model)
-        editToolbar.delegate = self
-        self.view = editToolbar
-    }
-
     init(mediaLibraryService: MediaLibraryService,
          model: MediaLibraryBaseModel,
          presentingView: UICollectionView) {

+ 34 - 10
Sources/EditToolbar.swift

@@ -19,7 +19,6 @@ protocol EditToolbarDelegate: class {
 class EditToolbar: UIView {
     static let height: CGFloat = 60
     weak var delegate: EditToolbarDelegate?
-    private var model: MediaLibraryBaseModel
 
     private var stackView: UIStackView = {
         let stackView = UIStackView()
@@ -50,6 +49,10 @@ class EditToolbar: UIView {
         return addToPlaylistButton
     }()
 
+    private var renameButton: UIButton!
+    private var deleteButton: UIButton!
+    private var shareButton: UIButton!
+
     @objc func addToPlaylist() {
         delegate?.editToolbarDidAddToPlaylist(self)
     }
@@ -66,7 +69,7 @@ class EditToolbar: UIView {
         delegate?.editToolbarDidShare(self)
     }
 
-    private func setupRightStackView() {
+    func updateEditToolbar(for model: MediaLibraryBaseModel) {
         var buttonList = EditButtonsFactory.buttonList(for: model.anyfiles.first)
         // For now we remove the first button which is Add to playlist since it is not in the same group
         if buttonList.contains(.addToPlaylist) {
@@ -74,17 +77,41 @@ class EditToolbar: UIView {
                 buttonList.remove(at: index)
             }
         }
-        let buttons = EditButtonsFactory.generate(buttons: buttonList)
+
+        // Hide all buttons and show depending on model
+        renameButton.isHidden = true
+        deleteButton.isHidden = true
+        shareButton.isHidden = true
+
+        for buttonType in buttonList {
+            switch buttonType {
+            case .addToPlaylist:
+                addToPlaylistButton.isHidden = false
+            case .rename:
+                renameButton.isHidden = false
+            case .delete:
+                deleteButton.isHidden = false
+            case .share:
+                shareButton.isHidden = false
+            }
+        }
+    }
+
+    private func setupRightStackView() {
+        let buttons = EditButtonsFactory.generate(buttons: [.rename, .delete, .share])
         for button in buttons {
             switch button.identifier {
                 case .addToPlaylist:
                     rightStackView.addArrangedSubview(button.button(#selector(addToPlaylist)))
                 case .rename:
-                    rightStackView.addArrangedSubview(button.button(#selector(rename)))
+                    renameButton = button.button(#selector(rename))
+                    rightStackView.addArrangedSubview(renameButton)
                 case .delete:
-                    rightStackView.addArrangedSubview(button.button(#selector(deleteSelection)))
+                    deleteButton = button.button(#selector(deleteSelection))
+                    rightStackView.addArrangedSubview(deleteButton)
                 case .share:
-                    rightStackView.addArrangedSubview(button.button(#selector(share)))
+                    shareButton = button.button(#selector(share))
+                    rightStackView.addArrangedSubview(shareButton)
             }
         }
     }
@@ -103,13 +130,10 @@ class EditToolbar: UIView {
     }
 
     private func setupView() {
-        layer.shadowOpacity = 0.1
-        layer.shadowOffset = CGSize(width: 0, height: -1)
         backgroundColor = PresentationTheme.current.colors.background
     }
 
-    init(model: MediaLibraryBaseModel) {
-        self.model = model
+    init() {
         super.init(frame: .zero)
         setupView()
         setupRightStackView()

+ 5 - 22
Sources/MediaCategories/MediaCategoryViewController.swift

@@ -39,7 +39,6 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega
         return editController
     }()
 
-    private var editToolbarConstraint: NSLayoutConstraint?
     private var cachedCellSize = CGSize.zero
     private var toSize = CGSize.zero
     private var longPressGesture: UILongPressGestureRecognizer!
@@ -185,7 +184,6 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega
         super.viewDidLoad()
         setupCollectionView()
         setupSearchBar()
-        setupEditToolbar()
         _ = (MLMediaLibrary.sharedMediaLibrary() as! MLMediaLibrary).libraryDidAppear()
     }
 
@@ -209,7 +207,6 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega
     @objc func themeDidChange() {
         collectionView?.backgroundColor = PresentationTheme.current.colors.background
         searchBar.backgroundColor = PresentationTheme.current.colors.background
-        editController.view.backgroundColor = PresentationTheme.current.colors.background
 
         if #available(iOS 13.0, *) {
             navigationController?.navigationBar.standardAppearance = AppearanceManager.navigationbarAppearance()
@@ -218,22 +215,6 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega
         setNeedsStatusBarAppearanceUpdate()
     }
 
-    func setupEditToolbar() {
-        editController.view.translatesAutoresizingMaskIntoConstraints = false
-        view.addSubview(editController.view)
-        var guide: LayoutAnchorContainer = view
-        if #available(iOS 11.0, *) {
-            guide = view.safeAreaLayoutGuide
-        }
-        editToolbarConstraint = editController.view.bottomAnchor.constraint(equalTo: guide.bottomAnchor, constant: EditToolbar.height)
-        NSLayoutConstraint.activate([
-            editToolbarConstraint!,
-            editController.view.leadingAnchor.constraint(equalTo: guide.leadingAnchor),
-            editController.view.trailingAnchor.constraint(equalTo: guide.trailingAnchor),
-            editController.view.heightAnchor.constraint(equalToConstant: 50)
-        ])
-    }
-
     func isEmptyCollectionView() -> Bool {
         return collectionView?.numberOfItems(inSection: 0) == 0
     }
@@ -304,9 +285,11 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega
     }
 
     private func displayEditToolbar() {
-        UIView.animate(withDuration: 0.3) { [weak self] in
-            self?.editToolbarConstraint?.constant = self?.isEditing == true ? 0 : EditToolbar.height
-            self?.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: self?.isEditing == true ? EditToolbar.height : 0, right: 0)
+        if isEditing {
+            tabBarController?.editToolBar()?.delegate = editController
+            tabBarController?.displayEditToolbar(with: model)
+        } else {
+            tabBarController?.hideEditToolbar()
         }
     }
 

+ 51 - 0
Sources/TabBarCoordinator.swift

@@ -14,6 +14,8 @@ class TabBarCoordinator: NSObject {
     private var tabBarController: UITabBarController
     private var services: Services
 
+    private lazy var editToolbar = EditToolbar()
+
     init(tabBarController: UITabBarController, services: Services) {
         self.tabBarController = tabBarController
         self.services = services
@@ -24,10 +26,12 @@ class TabBarCoordinator: NSObject {
 
     private func setup() {
         setupViewControllers()
+        setupEditToolbar()
         updateTheme()
     }
 
     @objc func updateTheme() {
+        editToolbar.backgroundColor = PresentationTheme.current.colors.tabBarColor
         //Setting this in appearanceManager doesn't update tabbar and UINavigationbar of the settingsViewController on change hence we do it here
         tabBarController.tabBar.isTranslucent = false
         tabBarController.tabBar.backgroundColor = PresentationTheme.current.colors.tabBarColor
@@ -87,6 +91,30 @@ class TabBarCoordinator: NSObject {
     }
 }
 
+// MARK: - Edit ToolBar
+
+private extension TabBarCoordinator {
+    func setupEditToolbar() {
+        editToolbar.isHidden = true
+        editToolbar.translatesAutoresizingMaskIntoConstraints = false
+        tabBarController.tabBar.addSubview(editToolbar)
+        tabBarController.tabBar.bringSubviewToFront(editToolbar)
+
+        let view = tabBarController.tabBar
+        var guide: LayoutAnchorContainer = view
+        if #available(iOS 11.0, *) {
+            guide = view.safeAreaLayoutGuide
+        }
+
+        NSLayoutConstraint.activate([
+            editToolbar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+            editToolbar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+            editToolbar.topAnchor.constraint(equalTo: guide.topAnchor),
+            editToolbar.bottomAnchor.constraint(equalTo: guide.bottomAnchor),
+        ])
+    }
+}
+
 extension UITabBarController {
     open override var preferredStatusBarStyle: UIStatusBarStyle {
         return PresentationTheme.current.colors.statusBarStyle
@@ -110,3 +138,26 @@ extension UITabBarController {
         }
     }
 }
+
+// MARK: UITabBarController - Edit
+
+extension UITabBarController {
+    func editToolBar() -> EditToolbar? {
+        return tabBar.subviews.filter() { $0 is EditToolbar }.first as? EditToolbar
+    }
+
+    func displayEditToolbar(with model: MediaLibraryBaseModel) {
+        guard let editToolbar = editToolBar() else {
+            return
+        }
+        editToolbar.updateEditToolbar(for: model)
+        editToolbar.isHidden = false
+    }
+
+    func hideEditToolbar() {
+        guard let editToolbar = editToolBar() else {
+            return
+        }
+        editToolbar.isHidden = true
+    }
+}