Проведите пальцем, чтобы открыть View Controller в Swift - PullRequest
0 голосов
/ 02 июля 2018

Я использую модуль контроллера слайдов в моем проекте и у меня есть небольшая проблема. Когда в стеке навигации есть контроллеры, и я хочу провести пальцем влево, вместо всплывающего окна появляется меню бургера. Как это можно изменить? Может ли кто-нибудь, пожалуйста, вести меня?

Так что я знаю, что это довольно базовая функциональность, которую вы получаете бесплатно, но она здесь переопределена.

Я пытался отключить жест панорамирования для слайд-меню, но он отключил весь механизм.

SlideMenuOptions.panGesturesEnabled = false

Я также нашел метод handleLeftPanGesture(_ panGesture: UIPanGestureRecognizer), который выглядит следующим образом:

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
}

И я пытаюсь посчитать навигационные ViewControllers, но это не помогло.

1 Ответ

0 голосов
/ 14 августа 2018

На самом деле я нашел решение, которое может кому-то помочь.

Вам необходимо добавить это в ViewController и соответствовать UIGestureRecognizerDelegate протоколу

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
    }
}
...