Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 59faed8ef9 | |||
| 4f990e86a8 | |||
| 8200e0d49f | |||
| 5bb2f86b0a | |||
| c591059fbe |
@@ -294,6 +294,12 @@ open class SideMenuNavigationController: UINavigationController {
|
||||
}
|
||||
|
||||
override open func pushViewController(_ viewController: UIViewController, animated: Bool) {
|
||||
guard viewControllers.count > 0 else {
|
||||
// NOTE: pushViewController is called by init(rootViewController: UIViewController)
|
||||
// so we must perform the normal super method in this case
|
||||
return super.pushViewController(viewController, animated: animated)
|
||||
}
|
||||
|
||||
var alongsideTransition: (() -> Void)? = nil
|
||||
if dismissOnPush {
|
||||
alongsideTransition = { [weak self] in
|
||||
@@ -302,7 +308,7 @@ open class SideMenuNavigationController: UINavigationController {
|
||||
}
|
||||
}
|
||||
|
||||
SideMenuPushCoordinator(config:
|
||||
let pushed = SideMenuPushCoordinator(config:
|
||||
.init(
|
||||
allowPushOfSameClassTwice: allowPushOfSameClassTwice,
|
||||
alongsideTransition: alongsideTransition,
|
||||
@@ -312,6 +318,10 @@ open class SideMenuNavigationController: UINavigationController {
|
||||
toViewController: viewController
|
||||
)
|
||||
).start()
|
||||
|
||||
if !pushed {
|
||||
super.pushViewController(viewController, animated: animated)
|
||||
}
|
||||
}
|
||||
|
||||
override open var transitioningDelegate: UIViewControllerTransitioningDelegate? {
|
||||
|
||||
@@ -7,19 +7,19 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
protocol Coordinator {
|
||||
associatedtype Model: CoordinatorModel
|
||||
|
||||
init(config: Model)
|
||||
func start()
|
||||
}
|
||||
|
||||
protocol CoordinatorModel {
|
||||
var animated: Bool { get }
|
||||
var fromViewController: UIViewController { get }
|
||||
var toViewController: UIViewController { get }
|
||||
}
|
||||
|
||||
protocol Coordinator {
|
||||
associatedtype Model: CoordinatorModel
|
||||
|
||||
init(config: Model)
|
||||
@discardableResult func start() -> Bool
|
||||
}
|
||||
|
||||
internal final class SideMenuPushCoordinator: Coordinator {
|
||||
|
||||
struct Model: CoordinatorModel {
|
||||
@@ -37,21 +37,19 @@ internal final class SideMenuPushCoordinator: Coordinator {
|
||||
self.config = config
|
||||
}
|
||||
|
||||
func start() {
|
||||
guard let fromNavigationController = config.fromViewController as? UINavigationController else { return }
|
||||
let toViewController = config.toViewController
|
||||
guard fromNavigationController.viewControllers.count > 0 else {
|
||||
// NOTE: pushViewController is called by init(rootViewController: UIViewController)
|
||||
// so we must perform the normal super method in this case
|
||||
return fromNavigationController.pushViewController(toViewController, animated: config.animated)
|
||||
@discardableResult func start() -> Bool {
|
||||
guard config.pushStyle != .subMenu,
|
||||
let fromNavigationController = config.fromViewController as? UINavigationController else {
|
||||
return false
|
||||
}
|
||||
|
||||
let toViewController = config.toViewController
|
||||
let presentingViewController = fromNavigationController.presentingViewController
|
||||
let splitViewController = presentingViewController as? UISplitViewController
|
||||
let tabBarController = presentingViewController as? UITabBarController
|
||||
let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController
|
||||
guard var navigationController = potentialNavigationController as? UINavigationController else {
|
||||
return Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
|
||||
guard let navigationController = potentialNavigationController as? UINavigationController else {
|
||||
Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
|
||||
return false
|
||||
}
|
||||
|
||||
// To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu
|
||||
@@ -64,7 +62,7 @@ internal final class SideMenuPushCoordinator: Coordinator {
|
||||
|
||||
if let lastViewController = navigationController.viewControllers.last,
|
||||
!config.allowPushOfSameClassTwice && type(of: lastViewController) == type(of: toViewController) {
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
toViewController.navigationItem.hidesBackButton = config.pushStyle.hidesBackButton
|
||||
@@ -72,32 +70,38 @@ internal final class SideMenuPushCoordinator: Coordinator {
|
||||
switch config.pushStyle {
|
||||
|
||||
case .default:
|
||||
break
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
|
||||
// subMenu handled earlier
|
||||
case .subMenu:
|
||||
navigationController = fromNavigationController
|
||||
break
|
||||
return false
|
||||
|
||||
case .popWhenPossible:
|
||||
for subViewController in navigationController.viewControllers.reversed() {
|
||||
if type(of: subViewController) == type(of: toViewController) {
|
||||
navigationController.popToViewController(subViewController, animated: config.animated)
|
||||
return
|
||||
return true
|
||||
}
|
||||
}
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
|
||||
case .preserve, .preserveAndHideBackButton:
|
||||
var viewControllers = navigationController.viewControllers
|
||||
let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: toViewController) }
|
||||
guard let preservedViewController = filtered.last else { break }
|
||||
guard let preservedViewController = filtered.last else {
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
return true
|
||||
}
|
||||
viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController }
|
||||
viewControllers.append(preservedViewController)
|
||||
return navigationController.setViewControllers(viewControllers, animated: config.animated)
|
||||
navigationController.setViewControllers(viewControllers, animated: config.animated)
|
||||
return true
|
||||
|
||||
case .replace:
|
||||
return navigationController.setViewControllers([toViewController], animated: config.animated)
|
||||
navigationController.setViewControllers([toViewController], animated: config.animated)
|
||||
return true
|
||||
}
|
||||
|
||||
navigationController.pushViewController(toViewController, animated: config.animated)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SideMenu"
|
||||
s.version = "6.2.6"
|
||||
s.version = "6.2.8"
|
||||
s.summary = "Simple side menu control for iOS in Swift inspired by Facebook. Right and Left sides. No coding required."
|
||||
|
||||
# This description is used to generate tags and improve search results.
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
7B552D5D1DCC65830010301C /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B552D5C1DCC65830010301C /* Launch Screen.storyboard */; };
|
||||
7B5FA9B61DCB269700278DF6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B5FA9B51DCB269700278DF6 /* Main.storyboard */; };
|
||||
8432CC0422FFBCF5003D2BBD /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */; };
|
||||
849F7B68232104BD005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B67232104BD005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
849F7B9623210C9A005DEB6A /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */; };
|
||||
849F7B9723210C9A005DEB6A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */; };
|
||||
849F7B9823210C9A005DEB6A /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */; };
|
||||
@@ -30,6 +29,7 @@
|
||||
849F7BA123210C9A005DEB6A /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */; };
|
||||
849F7BA223210C9A005DEB6A /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9423210C9A005DEB6A /* SideMenuManager.swift */; };
|
||||
849F7BA323210C9A005DEB6A /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9523210C9A005DEB6A /* Protected.swift */; };
|
||||
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B67232104BD005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
84B489B51DD469B000D6CB43 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B21DD469B000D6CB43 /* LICENSE */; };
|
||||
84B489B71DD469B000D6CB43 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B41DD469B000D6CB43 /* README.md */; };
|
||||
84B489BA1DD469DA00D6CB43 /* SideMenu.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B91DD469DA00D6CB43 /* SideMenu.podspec */; };
|
||||
@@ -216,7 +216,7 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
849F7B68232104BD005DEB6A /* SideMenu.h in Headers */,
|
||||
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user