0

I'm using the Slide menu controller pod in my project and have a little problem. When there are controllers in navigation stack and I want to swipe left, the burger menu appears instead of popping the contorller. How could that be changed? Could someone please guide me?

So I know it's a pretty basic functionality that you get for free, but it's overridden here.

I tried switching off the pan gesture for the slide menu, but it powered off the whole mechanism.

SlideMenuOptions.panGesturesEnabled = false

I also found the handleLeftPanGesture(_ panGesture: UIPanGestureRecognizer) method, which looks as follows:

open func isTargetViewController() -> Bool {
    // Function to determine the target ViewController
    // Please to override it if necessary
    guard let navController = navigationController else { return true }
    return navController.viewControllers.isEmpty
}

@objc func handleLeftPanGesture(_ panGesture: UIPanGestureRecognizer) {

    if !isTargetViewController() {
        navigationController?.popViewController(animated: true)
    }

    if isRightOpen() {
        return
    }

    switch panGesture.state {
        case UIGestureRecognizerState.began:
            if LeftPanState.lastState != .ended &&  LeftPanState.lastState != .cancelled &&  LeftPanState.lastState != .failed {
                return
            }

            if isLeftHidden() {
                self.delegate?.leftWillOpen?()
            } else {
                self.delegate?.leftWillClose?()
            }

            LeftPanState.frameAtStartOfPan = leftContainerView.frame
            LeftPanState.startPointOfPan = panGesture.location(in: view)
            LeftPanState.wasOpenAtStartOfPan = isLeftOpen()
            LeftPanState.wasHiddenAtStartOfPan = isLeftHidden()

            leftViewController?.beginAppearanceTransition(LeftPanState.wasHiddenAtStartOfPan, animated: true)
            addShadowToView(leftContainerView)
            setOpenWindowLevel()
        case UIGestureRecognizerState.changed:
            if LeftPanState.lastState != .began && LeftPanState.lastState != .changed {
                return
            }

            let translation: CGPoint = panGesture.translation(in: panGesture.view!)
            leftContainerView.frame = applyLeftTranslation(translation, toFrame: LeftPanState.frameAtStartOfPan)
            applyLeftOpacity()
            applyLeftContentViewScale()
        case UIGestureRecognizerState.ended, UIGestureRecognizerState.cancelled:
            if LeftPanState.lastState != .changed {
                setCloseWindowLevel()
                return
            }

            let velocity:CGPoint = panGesture.velocity(in: panGesture.view)
            let panInfo: PanInfo = panLeftResultInfoForVelocity(velocity)

            if panInfo.action == .open {
                if !LeftPanState.wasHiddenAtStartOfPan {
                    leftViewController?.beginAppearanceTransition(true, animated: true)
                }
                openLeftWithVelocity(panInfo.velocity)

                track(.leftFlickOpen)
            } else {
                if LeftPanState.wasHiddenAtStartOfPan {
                    leftViewController?.beginAppearanceTransition(false, animated: true)
                }
                closeLeftWithVelocity(panInfo.velocity)
                setCloseWindowLevel()

                track(.leftFlickClose)

            }
        case UIGestureRecognizerState.failed, UIGestureRecognizerState.possible:
            break
    }

    LeftPanState.lastState = panGesture.state
}

And I'm trying to count the navigaion ViewControllers, but it didn't help.

Max Kraev
  • 740
  • 12
  • 31

1 Answers1

6

Actaully I found the solution which might help someone.

You need to add this to ViewController and conform to UIGestureRecognizerDelegate protocol

override func viewDidAppear(_ animated: Bool) {
    slideMenuController()?.removeLeftGestures()
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

extension AdditionalInformationController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer.isEqual(navigationController?.interactivePopGestureRecognizer) {
            navigationController?.popViewController(animated: true)
        }
        return false
    }
}
Max Kraev
  • 740
  • 12
  • 31