diff --git a/DrawerView/DrawerPresentation.swift b/DrawerView/DrawerPresentation.swift index f769566..27e7ad6 100644 --- a/DrawerView/DrawerPresentation.swift +++ b/DrawerView/DrawerPresentation.swift @@ -19,8 +19,8 @@ extension UIViewController: DrawerPresenter { public class DrawerPresentationController: UIPresentationController { private let drawerView: DrawerView - private var presentationDelegate: DrawerPresentationDelegate? + private var isDismissing = false init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, @@ -76,6 +76,8 @@ public class DrawerPresentationController: UIPresentationController { public override func dismissalTransitionWillBegin() { super.dismissalTransitionWillBegin() + isDismissing = true + // Make callbacks backwards compatible if let callback = presentationDelegate?.drawerDismissalWillBegin(for:in:) { callback(presentedViewController, drawerView) @@ -86,13 +88,8 @@ public class DrawerPresentationController: UIPresentationController { public override func dismissalTransitionDidEnd(_ completed: Bool) { super.dismissalTransitionDidEnd(completed) + isDismissing = false - // Clean up the drawer for reuse. - presentedViewController.view.removeFromSuperview() - presentedViewController.removeFromParent() - drawerView.removeFromSuperview() - - // Make callbacks backwards compatible if let callback = presentationDelegate?.drawerDismissalDidEnd(for:in:completed:) { callback(presentedViewController, drawerView, completed) } else { @@ -103,10 +100,6 @@ public class DrawerPresentationController: UIPresentationController { override public var shouldRemovePresentersView: Bool { return false } - - override public func containerViewWillLayoutSubviews() { - super.containerViewWillLayoutSubviews() - } } @objc public protocol DrawerPresentationDelegate { @@ -130,7 +123,8 @@ public class DrawerPresentationController: UIPresentationController { extension DrawerPresentationController: DrawerViewDelegate { public func drawer(_ drawerView: DrawerView, willTransitionFrom startPosition: DrawerPosition, to targetPosition: DrawerPosition) { - if targetPosition == .closed { + // Only trigger dismiss if we're not already dismissing to avoid recursion + if targetPosition == .closed && !isDismissing { presentedViewController.dismiss(animated: true) } } @@ -170,6 +164,7 @@ extension DrawerPresentationManager: UIViewControllerTransitioningDelegate { public final class DrawerPresentationAnimator: NSObject { let presentation: PresentationType + private let animationDuration: TimeInterval = 0.3 // Standard iOS animation duration enum PresentationType { case present @@ -186,25 +181,31 @@ extension DrawerPresentationAnimator: UIViewControllerAnimatedTransitioning { public func transitionDuration( using transitionContext: UIViewControllerContextTransitioning? ) -> TimeInterval { - return 0.0 + return animationDuration } public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - switch presentation { case .present: guard let drawerView = transitionContext.view(forKey: .to) as? DrawerView else { + transitionContext.completeTransition(false) return } drawerView.setPosition(.open, animated: true) { finished in - transitionContext.completeTransition(finished) - } + transitionContext.completeTransition(finished) + } case .dismiss: guard let drawerView = transitionContext.view(forKey: .from) as? DrawerView else { + transitionContext.completeTransition(false) return } + + let originalVisibilityBehavior = drawerView.contentVisibilityBehavior + drawerView.contentVisibilityBehavior = .never + drawerView.setPosition(.closed, animated: true) { finished in + drawerView.contentVisibilityBehavior = originalVisibilityBehavior transitionContext.completeTransition(finished) } } diff --git a/DrawerView/DrawerView.swift b/DrawerView/DrawerView.swift index 19c2057..a42d155 100644 --- a/DrawerView/DrawerView.swift +++ b/DrawerView/DrawerView.swift @@ -498,7 +498,7 @@ private struct ChildScrollViewInfo { } func embed(view: UIView) { - view.backgroundColor = .clear + // view.backgroundColor = .clear view.frame = self.bounds view.translatesAutoresizingMaskIntoConstraints = false self.addSubview(view) diff --git a/Example/DrawerViewExample/Base.lproj/Main.storyboard b/Example/DrawerViewExample/Base.lproj/Main.storyboard index f289e7a..9eec2bd 100644 --- a/Example/DrawerViewExample/Base.lproj/Main.storyboard +++ b/Example/DrawerViewExample/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -211,7 +211,7 @@ - + @@ -222,7 +222,7 @@ - + diff --git a/Example/DrawerViewExample/ViewController.swift b/Example/DrawerViewExample/ViewController.swift index 7eb056a..20e444f 100644 --- a/Example/DrawerViewExample/ViewController.swift +++ b/Example/DrawerViewExample/ViewController.swift @@ -112,12 +112,12 @@ class ViewController: UIViewController { } } - let drawerPresentation = DrawerPresentationManager() + let settingsPresentation = DrawerPresentationManager() private func presentDrawer() { - let viewController = self.storyboard!.instantiateViewController(withIdentifier: "ModalPresentationViewController") as! ModalPresentationViewController - drawerPresentation.drawer.openHeightBehavior = .fitting - viewController.transitioningDelegate = drawerPresentation + let viewController = UIViewController() +// settingsPresentation.drawer.openHeightBehavior = .fitting + viewController.transitioningDelegate = settingsPresentation viewController.modalPresentationStyle = .custom self.present(viewController, animated: true, completion: nil) }