如何从标签栏打开侧面菜单 [英] How to open side menu from tabbar

查看:114
本文介绍了如何从标签栏打开侧面菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现以下操作,例如从标签栏项目单击打开下面的侧菜单。

I am trying to achieve some thing like following side menu open from tabbar item click.

我在过渡动画中使用了以下类...

I used the following class for Transition Animation ...

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


}

并在我的代码中使用它,如下所示

and use it in my code as follow

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

但是动画根本不起作用...我想像在当前上下文中的侧菜单一样打开它。.

but animation doe't work at all ... I want to open it like side menu over current context ..

我如何实现某些目标像这样...

How can i achieve some thing like that ...

推荐答案

TabBar不能仅仅为单个子View控制器处理动画过渡。如果您应用自定义过渡,它将被应用在其所有选项卡(子视图控制器)中。另外,我上次检查时,airbnb的应用在打开用户个人资料时的行为不一样。 :)

TabBar is not made to handle animate transition for just a single child View controller. If you apply a custom transition, it will be applied in all of its tabs (child view controllers). Plus last time i checked, airbnb's app doesn't behave like that when opening the user profile. :)

不过,您可以做的是,在导航视图控制器顶部或任何位置有一个单独的菜单按钮,然后从那里调用幻灯片:

What you can do, though, is have a separate menu button at the top of your navigation view controller or wherever and call the slide in from there:

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

或者如果您坚持将菜单作为选项卡的一部分,则可以

Or if you insist on having the menu a part of the tabs, then you can do this.

希望这会有所帮助。 :)

Hope this helps. :)

这篇关于如何从标签栏打开侧面菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆