Как я могу добавить жест смахивания к контроллеру бокового меню? - PullRequest
0 голосов
/ 30 сентября 2019

Я создал боковое меню с некоторыми элементами управления, и я могу закрыть его, когда пользователь нажимает за пределы бокового меню или если он / она выбирает строку внутри бокового меню. Теперь я хочу добавить жест смахивания влево, чтобы пользователь мог отклонить его таким же образом.


extension MenuViewController {

@objc func dismissControllerAnimated() {
    dismiss(animated: true, completion: nil)
} }

class SlideinTransition: NSObject, UIViewControllerAnimatedTransitioning {

let menuViewController = MenuViewController()

var isPresenting = true
let dimmingView = UIView()

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return 0.5
}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let toViewController = transitionContext.viewController(forKey: .to),
    let fromViewController = transitionContext.viewController(forKey: .from) else { return }
    let containerView = transitionContext.containerView

    let finalWidth = toViewController.view.bounds.width * 0.3
    let finalHeight = toViewController.view.bounds.height

    if isPresenting{

        //adds a tap gesture to our dimming view
        let tapGesture = UITapGestureRecognizer(target: toViewController, action: #selector(MenuViewController.dismissControllerAnimated))
        dimmingView.addGestureRecognizer(tapGesture)

        //adds the dimming view
        dimmingView.backgroundColor = .black
        dimmingView.alpha = 0.0
        containerView.addSubview(dimmingView)
        dimmingView.frame = containerView.bounds
        //adds the menu view controller to our container
        containerView.addSubview(toViewController.view)

        //init frame off the screen
        toViewController.view.frame = CGRect(x: -finalWidth, y: 0, width: finalWidth, height: finalHeight)
    }

    let transform = {
        self.dimmingView.alpha = 0.5
        toViewController.view.transform = CGAffineTransform(translationX: finalWidth, y: 0)
    }

    //applies a specific kind of transformation to our view
    let identity = {
        self.dimmingView.alpha = 0.0
        fromViewController.view.transform = .identity
    }

    //animates the transition and cancels it when you click outside of the frame
    let duration = transitionDuration(using: transitionContext)
    let isCancelled = transitionContext.transitionWasCancelled
    UIView.animate(withDuration: duration, animations: {
        self.isPresenting ? transform() : identity()
    }) { (_) in
        transitionContext.completeTransition(!isCancelled)
        if !self.isPresenting {
            self.dimmingView.removeFromSuperview()
        }
    }
}

}


Я создаю экземпляр моего "MenuViewController"вот так в мой MainController

@IBAction func didTapMenu(_ sender: UIBarButtonItem) {
    guard let menuViewController = storyboard?.instantiateViewController(withIdentifier: "MenuViewController") as? MenuViewController else { return }
    menuViewController.didTapMenuType = { menuType in
        self.transitionToNew(menuType)
    }
    menuViewController.modalPresentationStyle = .overCurrentContext
    menuViewController.transitioningDelegate = self
    present(menuViewController, animated: true)
}

Как я могу добавить SwipeGestureRecognizer к моему переходу? Я ценю каждый вклад. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...