Как я могу закрыть свое слайд-меню, нажав снаружи? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть меню гамбургеров, которое скользит с сайта. Он закрывает меню каждый раз, когда я выбираю ячейку. Я хочу добавить TapRecognizer, чтобы он также отклонял его при нажатии снаружи. Это - мой HomeViewController.

var isPresenting = true
let dimmingView = UIView()

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

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.8
    let finalHeight = toViewController.view.bounds.height

    if isPresenting{
        //addas 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)
    }

    let identity = {
        self.dimmingView.alpha = 0.0
        fromViewController.view.transform = .identity
    }

    //animates the transition
    let duration = transitionDuration(using: transitionContext)
    let isCancelledBySystem = transitionContext.transitionWasCancelled
    UIView.animate(withDuration: duration, animations: {
        self.isPresenting ? transform() : identity()
    }) { (_) in
        transitionContext.completeTransition(!isCancelledBySystem)
    }
}

Нажатие снаружи должно закрыть меню

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Назначьте делегат жеста касания вашему контроллеру представления. В методе жеста держите код, чтобы закрыть меню. Представленный ниже делегат позволяет жесту получать прикосновение только при касании за пределами меню и не закрывается, если он находится внутри меню.

@objc private func tapGesture(_ gesture: UIGestureRecognizer) {
        self.closeMenu()
    }

extension SharePathViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        let point = touch.location(in: view)
        return !menuView.frame.contains(point)
    }

}
1 голос
/ 05 июня 2019

Вам просто нужно добавить UITapGestureRecognizer к родительскому представлению

после этого при нажатии на кнопку, чтобы использовать func location(in: UIView?) -> CGPoint и проверить, находится ли касание за пределами рамки слайд-меню.

@IBAction func touchWasDetected(_ sender: UITapGestureRecognizer) {
    let touchPoint = sender.location(in: view)
    if !slideView.frame.contains(touchPoint) {
        dissmiss()
    }
}

Действие жеста подключения к методу

enter image description here

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