diff --git a/Example/Base.lproj/Main.storyboard b/Example/Base.lproj/Main.storyboard index 5456038..447f1fb 100644 --- a/Example/Base.lproj/Main.storyboard +++ b/Example/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -15,8 +15,8 @@ - + @@ -43,13 +43,13 @@ - + - + - + - + + + + - + + + - + - + - + - + + @@ -259,7 +278,6 @@ - @@ -273,6 +291,7 @@ + @@ -312,7 +331,7 @@ + @@ -662,7 +682,6 @@ - diff --git a/Example/MenuViewController.swift b/Example/MenuViewController.swift index ea93bd6..0761e3d 100644 --- a/Example/MenuViewController.swift +++ b/Example/MenuViewController.swift @@ -119,6 +119,13 @@ extension MenuViewController: SideMenuControllerDelegate { func sideMenuControllerDidRevealMenu(_ sideMenuController: SideMenuController) { print("[Example] Menu did reveal.") } + + func sideMenuControllerGetMenuWidth(_ sideMenuController: SideMenuController, for size: CGSize) -> CGFloat? { + if size.width > size.height { + return 480 + } + return 240 + } } extension MenuViewController: UITableViewDelegate, UITableViewDataSource { diff --git a/Example/PreferencesViewController.swift b/Example/PreferencesViewController.swift index b8bd59e..89e75e5 100644 --- a/Example/PreferencesViewController.swift +++ b/Example/PreferencesViewController.swift @@ -23,6 +23,7 @@ class PreferencesViewController: UIViewController { @IBOutlet weak var enablePanGesture: UISwitch! @IBOutlet weak var enableRubberBandEffect: UISwitch! @IBOutlet weak var enableTransitionAnimationSwitch: UISwitch! + @IBOutlet weak var keepsOpenSwitch: UISwitch! @IBOutlet weak var statusBarBehaviorSegment: UISegmentedControl! @IBOutlet weak var menuPositionSegment: UISegmentedControl! @IBOutlet weak var menuDirectionSegment: UISegmentedControl! @@ -134,6 +135,8 @@ class PreferencesViewController: UIViewController { SideMenuController.preferences.basic.enableRubberEffectWhenPanning = sender.isOn case enableTransitionAnimationSwitch: Preferences.shared.enableTransitionAnimation = sender.isOn + case keepsOpenSwitch: + SideMenuController.preferences.basic.keepsMenuOpenAfterRotation = sender.isOn default: break } diff --git a/Sources/SideMenu/Delegate.swift b/Sources/SideMenu/Delegate.swift index 144afac..3e51fec 100644 --- a/Sources/SideMenu/Delegate.swift +++ b/Sources/SideMenu/Delegate.swift @@ -73,6 +73,11 @@ public protocol SideMenuControllerDelegate: AnyObject { /// /// - Parameter sideMenu: The side menu func sideMenuControllerDidHideMenu(_ sideMenuController: SideMenuController) + + + /// Get the width of side menu in current size + /// - Parameter sideMenuController: The side menu + func sideMenuControllerGetMenuWidth(_ sideMenuController: SideMenuController, for size: CGSize) -> CGFloat? } // Provides default implementation for delegates @@ -89,9 +94,10 @@ public extension SideMenuControllerDelegate { func sideMenuController(_ sideMenuController: SideMenuController, didShow viewController: UIViewController, animated: Bool) {} - func sideMenuControllerShouldRevealMenu(_ sideMenuController: SideMenuController) -> Bool { return true } + func sideMenuControllerShouldRevealMenu(_ sideMenuController: SideMenuController) -> Bool { true } func sideMenuControllerWillRevealMenu(_ sideMenuController: SideMenuController) {} func sideMenuControllerDidRevealMenu(_ sideMenuController: SideMenuController) {} func sideMenuControllerWillHideMenu(_ sideMenuController: SideMenuController) {} func sideMenuControllerDidHideMenu(_ sideMenuController: SideMenuController) {} + func sideMenuControllerGetMenuWidth(_ sideMenuController: SideMenuController, for size: CGSize) -> CGFloat? { nil } } diff --git a/Sources/SideMenu/Preferences.swift b/Sources/SideMenu/Preferences.swift index e00e7ed..42dbc6d 100644 --- a/Sources/SideMenu/Preferences.swift +++ b/Sources/SideMenu/Preferences.swift @@ -124,8 +124,8 @@ extension SideMenuController { /// The sensitivity of the pan gesture recognizer revealing menu view controller. public var panGestureSensitivity: CGFloat = 0.25 - /// If the side menu should keep open on rotation. Default is false. - public var shouldKeepMenuOpen: Bool = false + /// If the side menu should keep open on rotation. Default is `false`. + public var keepsMenuOpenAfterRotation: Bool = false } /// The basic configuration of side menu. diff --git a/Sources/SideMenu/SideMenuController.swift b/Sources/SideMenu/SideMenuController.swift index bf7cc4f..4ca50e3 100644 --- a/Sources/SideMenu/SideMenuController.swift +++ b/Sources/SideMenu/SideMenuController.swift @@ -24,13 +24,17 @@ open class SideMenuController: UIViewController { /// Configure this property to change the behavior of SideMenuController; public static var preferences = Preferences() private var preferences: Preferences { - return type(of: self).preferences + Self.preferences } private lazy var adjustedDirection = Preferences.MenuDirection.left private var isInitiatedFromStoryboard: Bool { - return storyboard != nil + storyboard != nil + } + + private var menuWidth: CGFloat { + delegate?.sideMenuControllerGetMenuWidth(self, for: view.frame.size) ?? preferences.basic.menuWidth } /// The identifier of content view controller segue. @@ -379,7 +383,6 @@ open class SideMenuController: UIViewController { } @objc private func handlePanGesture(_ pan: UIPanGestureRecognizer) { - let menuWidth = preferences.basic.menuWidth let isLeft = adjustedDirection == .left var translation = pan.translation(in: pan.view).x let viewToAnimate: UIView @@ -682,7 +685,7 @@ open class SideMenuController: UIViewController { case .above, .sideBySide: var baseFrame = CGRect(origin: view.frame.origin, size: targetSize ?? view.frame.size) if visibility { - baseFrame.origin.x = preferences.basic.menuWidth - baseFrame.width + baseFrame.origin.x = menuWidth - baseFrame.width } else { baseFrame.origin.x = -baseFrame.width } @@ -703,7 +706,7 @@ open class SideMenuController: UIViewController { var baseFrame = CGRect(origin: view.frame.origin, size: targetSize ?? view.frame.size) if visibility { let factor: CGFloat = adjustedDirection == .left ? 1 : -1 - baseFrame.origin.x = preferences.basic.menuWidth * factor + baseFrame.origin.x = menuWidth * factor } else { baseFrame.origin.x = 0 } @@ -711,28 +714,22 @@ open class SideMenuController: UIViewController { } } - private func updateSideMenuWidth() { - let fifteenPercent = 0.15 - let size = UIScreen.main.bounds.size - SideMenuController.preferences.basic.menuWidth = size.width - (size.width * CGFloat(fifteenPercent)) - } - private func keepSideMenuOpenOnRotation() { - if menuViewController != nil { - if self.isMenuRevealed { - self.hideMenu(animated: false, completion: nil) + guard menuViewController != nil else { + return + } + + if isMenuRevealed { + hideMenu(animated: false, completion: nil) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { + self.revealMenu(animated: false, completion: nil) + }) + } else { + revealMenu(animated: false) { _ in DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { - self.updateSideMenuWidth() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { - self.revealMenu(animated: false, completion: nil) - }) + self.hideMenu(animated: false, completion: nil) }) - } else { - self.revealMenu(animated: false) { _ in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { - self.hideMenu(animated: false, completion: nil) - }) - } } } } @@ -754,8 +751,8 @@ open class SideMenuController: UIViewController { } open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - if preferences.basic.shouldKeepMenuOpen { - self.keepSideMenuOpenOnRotation() + if preferences.basic.keepsMenuOpenAfterRotation { + keepSideMenuOpenOnRotation() } else { hideMenu(animated: false, completion: { _ in // Temporally hide the menu container view for smooth animation