@@ -19,8 +19,8 @@ extension UIViewController: DrawerPresenter {
1919public class DrawerPresentationController : UIPresentationController {
2020
2121 private let drawerView : DrawerView
22-
2322 private var presentationDelegate : DrawerPresentationDelegate ?
23+ private var isDismissing = false
2424
2525 init ( presentedViewController: UIViewController ,
2626 presenting presentingViewController: UIViewController ? ,
@@ -76,6 +76,8 @@ public class DrawerPresentationController: UIPresentationController {
7676
7777 public override func dismissalTransitionWillBegin( ) {
7878 super. dismissalTransitionWillBegin ( )
79+ isDismissing = true
80+
7981 // Make callbacks backwards compatible
8082 if let callback = presentationDelegate? . drawerDismissalWillBegin ( for: in: ) {
8183 callback ( presentedViewController, drawerView)
@@ -86,13 +88,8 @@ public class DrawerPresentationController: UIPresentationController {
8688
8789 public override func dismissalTransitionDidEnd( _ completed: Bool ) {
8890 super. dismissalTransitionDidEnd ( completed)
91+ isDismissing = false
8992
90- // Clean up the drawer for reuse.
91- presentedViewController. view. removeFromSuperview ( )
92- presentedViewController. removeFromParent ( )
93- drawerView. removeFromSuperview ( )
94-
95- // Make callbacks backwards compatible
9693 if let callback = presentationDelegate? . drawerDismissalDidEnd ( for: in: completed: ) {
9794 callback ( presentedViewController, drawerView, completed)
9895 } else {
@@ -103,10 +100,6 @@ public class DrawerPresentationController: UIPresentationController {
103100 override public var shouldRemovePresentersView : Bool {
104101 return false
105102 }
106-
107- override public func containerViewWillLayoutSubviews( ) {
108- super. containerViewWillLayoutSubviews ( )
109- }
110103}
111104
112105@objc public protocol DrawerPresentationDelegate {
@@ -130,7 +123,8 @@ public class DrawerPresentationController: UIPresentationController {
130123extension DrawerPresentationController : DrawerViewDelegate {
131124
132125 public func drawer( _ drawerView: DrawerView , willTransitionFrom startPosition: DrawerPosition , to targetPosition: DrawerPosition ) {
133- if targetPosition == . closed {
126+ // Only trigger dismiss if we're not already dismissing to avoid recursion
127+ if targetPosition == . closed && !isDismissing {
134128 presentedViewController. dismiss ( animated: true )
135129 }
136130 }
@@ -170,6 +164,7 @@ extension DrawerPresentationManager: UIViewControllerTransitioningDelegate {
170164public final class DrawerPresentationAnimator : NSObject {
171165
172166 let presentation : PresentationType
167+ private let animationDuration : TimeInterval = 0.3 // Standard iOS animation duration
173168
174169 enum PresentationType {
175170 case present
@@ -186,25 +181,31 @@ extension DrawerPresentationAnimator: UIViewControllerAnimatedTransitioning {
186181 public func transitionDuration(
187182 using transitionContext: UIViewControllerContextTransitioning ?
188183 ) -> TimeInterval {
189- return 0.0
184+ return animationDuration
190185 }
191186
192187 public func animateTransition( using transitionContext: UIViewControllerContextTransitioning ) {
193-
194188 switch presentation {
195189 case . present:
196190 guard let drawerView = transitionContext. view ( forKey: . to) as? DrawerView else {
191+ transitionContext. completeTransition ( false )
197192 return
198193 }
199194
200195 drawerView. setPosition ( . open, animated: true ) { finished in
201- transitionContext. completeTransition ( finished)
202- }
196+ transitionContext. completeTransition ( finished)
197+ }
203198 case . dismiss:
204199 guard let drawerView = transitionContext. view ( forKey: . from) as? DrawerView else {
200+ transitionContext. completeTransition ( false )
205201 return
206202 }
203+
204+ let originalVisibilityBehavior = drawerView. contentVisibilityBehavior
205+ drawerView. contentVisibilityBehavior = . never
206+
207207 drawerView. setPosition ( . closed, animated: true ) { finished in
208+ drawerView. contentVisibilityBehavior = originalVisibilityBehavior
208209 transitionContext. completeTransition ( finished)
209210 }
210211 }
0 commit comments