From 8fbf4002ac608ddce38ccfde689ea3db6e72cda9 Mon Sep 17 00:00:00 2001 From: jonkykong Date: Tue, 24 Jan 2017 21:19:26 -0800 Subject: [PATCH] Tighter logic for responding to only a single gesture to avoid conflicts. --- Pod/Classes/SideMenuTransition.swift | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Pod/Classes/SideMenuTransition.swift b/Pod/Classes/SideMenuTransition.swift index b1f932a..18613a4 100644 --- a/Pod/Classes/SideMenuTransition.swift +++ b/Pod/Classes/SideMenuTransition.swift @@ -13,6 +13,7 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr fileprivate var presenting = false fileprivate var interactive = false fileprivate static weak var originalSuperview: UIView? + fileprivate static weak var activeGesture: UIGestureRecognizer? fileprivate static var switchMenus = false internal static let singleton = SideMenuTransition() @@ -85,6 +86,14 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr } internal class func handlePresentMenuPan(_ pan: UIPanGestureRecognizer) { + if activeGesture == nil { + activeGesture = pan + } else if pan != activeGesture { + pan.isEnabled = false + pan.isEnabled = true + return + } + // how much distance have we panned in reference to the parent view? guard let view = viewControllerForPresentedMenu != nil ? viewControllerForPresentedMenu?.view : pan.view else { return @@ -109,6 +118,8 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr let visibleViewController = visibleViewController { singleton.interactive = true visibleViewController.present(menuViewController, animated: true, completion: nil) + } else { + return } } @@ -141,13 +152,23 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr singleton.update(0.9999) } singleton.finish() + activeGesture = nil } else { singleton.cancel() + activeGesture = nil } } } internal class func handleHideMenuPan(_ pan: UIPanGestureRecognizer) { + if activeGesture == nil { + activeGesture = pan + } else if pan != activeGesture { + pan.isEnabled = false + pan.isEnabled = true + return + } + let translation = pan.translation(in: pan.view!) let direction:CGFloat = SideMenuTransition.presentDirection == .left ? -1 : 1 let distance = translation.x / SideMenuManager.menuWidth * direction @@ -168,8 +189,10 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr singleton.update(0.9999) } singleton.finish() + activeGesture = nil } else { singleton.cancel() + activeGesture = nil } } }