Как открыть боковое меню из вкладки - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь добиться чего-то вроде следующего открытия бокового меню из tabbar нажатия элемента.

enter image description here

Я использовал следующий класс для перехода Анимация ...

class SlideInTransition: NSObject, UIViewControllerAnimatedTransitioning {

var isPresenting = false
let dimmingView = UIView()

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

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 {
        // Add dimming view
        dimmingView.backgroundColor = .black
        dimmingView.alpha = 0.0
        containerView.addSubview(dimmingView)
        dimmingView.frame = containerView.bounds
        // Add menu view controller to container
        containerView.addSubview(toViewController.view)

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

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


    // Move back off screen
    let identity = {
        self.dimmingView.alpha = 0.0
        fromViewController.view.transform = .identity
    }

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


}

и используйте ее в моем коде следующим образом

  guard let menuViewController = storyboard?.instantiateViewController(withIdentifier: "MenuVC") as? MenuVC else { return }
        menuViewController.modalPresentationStyle = .overCurrentContext
        menuViewController.transitioningDelegate = self as? UIViewControllerTransitioningDelegate
        menuViewController.tabBarItem.image = UIImage(named: "ico_menu")
        menuViewController.tabBarItem.selectedImage = UIImage(named: "ico_menu")

        viewControllers = [orderVC,serverdVC,canceledVC,menuViewController]


extension TabbarVC: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        transiton.isPresenting = true
        return transiton
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        transiton.isPresenting = false
        return transiton
    }
}

, но анимация вообще не работает ... Я хочу открыть ее как боковое меню поверх текущий контекст ..

Как мне достичь чего-то подобного ...

1 Ответ

1 голос
/ 22 марта 2020

TabBar не предназначен для обработки переходов анимации только для одного дочернего контроллера View. Если вы примените пользовательский переход, он будет применен во всех его вкладках (контроллеры дочерних представлений). Кроме того, в прошлый раз, когда я проверял, приложение airbnb не ведет себя так при открытии профиля пользователя. :)

Что вы можете сделать, так это иметь отдельную кнопку меню в верхней части контроллера навигации или в любом месте и вызывать слайд оттуда:

    func slideInView() {
        let vcToShow = MenuViewController()
        vcToShow.modalPresentationStyle = .overCurrentContext
        vcToShow.transitioningDelegate = self as? UIViewControllerTransitioningDelegate
        present(vcToShow, animated: true, completion: nil)
    }

Или если Вы настаиваете на том, чтобы меню было частью вкладок, тогда вы можете сделать this .

Надеюсь, это поможет. :)

...