diff --git a/Source/Turbo Navigator/Extensions/UINavigationControllerExtension.swift b/Source/Turbo Navigator/Extensions/UINavigationControllerExtension.swift index 6e750d0..981ae3b 100644 --- a/Source/Turbo Navigator/Extensions/UINavigationControllerExtension.swift +++ b/Source/Turbo Navigator/Extensions/UINavigationControllerExtension.swift @@ -5,4 +5,20 @@ extension UINavigationController { let viewControllers = viewControllers.dropLast() setViewControllers(viewControllers + [viewController], animated: false) } + + func setModalPresentationStyle(via proposal: VisitProposal) { + switch proposal.modalStyle { + case .medium: + modalPresentationStyle = .automatic + if #available(iOS 15.0, *) { + if let sheet = sheetPresentationController { + sheet.detents = [.medium(), .large()] + } + } + case .large: + modalPresentationStyle = .automatic + case .full: + modalPresentationStyle = .fullScreen + } + } } diff --git a/Source/Turbo Navigator/Extensions/VisitProposalExtension.swift b/Source/Turbo Navigator/Extensions/VisitProposalExtension.swift index 8d97578..3c67f00 100644 --- a/Source/Turbo Navigator/Extensions/VisitProposalExtension.swift +++ b/Source/Turbo Navigator/Extensions/VisitProposalExtension.swift @@ -1,3 +1,5 @@ +import UIKit + public extension VisitProposal { var context: TurboNavigation.Context { if let rawValue = properties["context"] as? String { @@ -13,6 +15,13 @@ public extension VisitProposal { return .default } + var modalStyle: TurboNavigation.ModalStyle { + if let rawValue = properties["modal-style"] as? String { + return TurboNavigation.ModalStyle(rawValue: rawValue) ?? .large + } + return .large + } + /// Used to identify a custom native view controller if provided in the path configuration properties of a given pattern. /// /// For example, given the following configuration file: diff --git a/Source/Turbo Navigator/Helpers/TurboNavigation.swift b/Source/Turbo Navigator/Helpers/TurboNavigation.swift index 7137d9d..7ecfcfe 100644 --- a/Source/Turbo Navigator/Helpers/TurboNavigation.swift +++ b/Source/Turbo Navigator/Helpers/TurboNavigation.swift @@ -13,4 +13,10 @@ public enum TurboNavigation { case replaceRoot = "replace_root" case none } + + public enum ModalStyle: String { + case medium + case large + case full + } } diff --git a/Source/Turbo Navigator/TurboNavigationHierarchyController.swift b/Source/Turbo Navigator/TurboNavigationHierarchyController.swift index ea95a5c..2b47e2a 100644 --- a/Source/Turbo Navigator/TurboNavigationHierarchyController.swift +++ b/Source/Turbo Navigator/TurboNavigationHierarchyController.swift @@ -18,8 +18,8 @@ class TurboNavigationHierarchyController { func navController(for navigationType: NavigationStackType) -> UINavigationController { switch navigationType { - case .main: navigationController - case .modal: modalNavigationController + case .main: navigationController + case .modal: modalNavigationController } } @@ -82,6 +82,7 @@ class TurboNavigationHierarchyController { pushOrReplace(on: modalNavigationController, with: controller, via: proposal) } else { modalNavigationController.setViewControllers([controller], animated: true) + modalNavigationController.setModalPresentationStyle(via: proposal) navigationController.present(modalNavigationController, animated: true) } if let visitable = controller as? Visitable { @@ -146,6 +147,7 @@ class TurboNavigationHierarchyController { modalNavigationController.replaceLastViewController(with: controller) } else { modalNavigationController.setViewControllers([controller], animated: false) + modalNavigationController.setModalPresentationStyle(via: proposal) navigationController.present(modalNavigationController, animated: true) } if let visitable = controller as? Visitable {