【问题标题】:presenting viewController with transition呈现带有过渡的 viewController
【发布时间】:2019-12-12 03:39:50
【问题描述】:

当我实例化并呈现视图控制器时,是否可以定义一种过渡类型?

这段代码生成了一个默认的淡入淡出类型过渡,但我需要它从左到右出现,可以吗?

谢谢!

@IBAction func botonVolverFamilias(_ sender: Any) {
    let sw  = revealViewController()
    self.view.window?.rootViewController = sw
    let viewControllerModelos = storyboard!.instantiateViewController(withIdentifier: "vc_catalogo_familias") as! VC_catalogo
    let navigationController = UINavigationController(rootViewController: viewControllerModelos)
    navigationController.navigationBar.isHidden=false
    navigationController.setNavigationBarHidden(true, animated: false)
    sw!.setFront(navigationController, animated: true)
}

【问题讨论】:

  • 我实际上有这样的代码,当将视图控制器推入导航堆栈时,它会从左向右或从右向左滑动。
  • 让我为你添加它。

标签: ios swift uinavigationcontroller swrevealviewcontroller


【解决方案1】:

更改UINavigationController 的转换需要使用的是在堆栈中找到第一个UIViewController。您应该将此UIViewController 扩展为UIViewControllerTransitioningDelegateUINavigationControllerDelegate

然后,您可以调用func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 来定义您想要呈现新的UIViewControllers 的过渡类型。

因此,为了做到这一点,我们必须创建一个自定义的UIViewControllerAnimatedTransitioning 类并在这个UIViewControllerTransitioningDelegate 方法中返回它。这是我使用的示例。

import UIKit

class SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {
    var direction: TransitionDirection!

    init(direction: TransitionDirection) {
        self.direction = direction
    }


    var popStyle: Bool = false

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        if popStyle {

            animatePop(using: transitionContext)
            return
        }

        let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
        let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

        let f = transitionContext.finalFrame(for: tz)

        let fOff = f.offsetBy(dx: f.width, dy: 0)
        tz.view.frame = fOff

        transitionContext.containerView.insertSubview(tz.view, aboveSubview: fz.view)

        UIView.animate(
        withDuration: transitionDuration(using: transitionContext),
        animations: {
                tz.view.frame = f
                for subview in fz.view.subviews {
                    subview.alpha = 0
                }
        }, completion: {_ in
            transitionContext.completeTransition(true)
        })
    }

    func animatePop(using transitionContext: UIViewControllerContextTransitioning) {

        let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
        let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

        let f = transitionContext.initialFrame(for: fz)
        let fOffPop = f.offsetBy(dx: f.width, dy: 0)

        transitionContext.containerView.insertSubview(tz.view, belowSubview: fz.view)

        UIView.animate(
        withDuration: transitionDuration(using: transitionContext),
        animations: {
                fz.view.frame = fOffPop
                for subview in tz.view.subviews {
                    subview.alpha = 1
                }
        }, completion: {_ in
            transitionContext.completeTransition(true)
        })
    }
}

enum TransitionDirection {
    case left
    case right
}

然后,在我们的func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 方法中,我们可以简单地返回这个UIViewControllerAnimatedTransitioning

extension YourViewController: UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {
    func navigationController(
    _ navigationController: UINavigationController,
    animationControllerFor operation: UINavigationController.Operation,
    from fromVC: UIViewController,
    to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        //This tells our navigation controller the style that we want to animate our transition between view controllers

        let simpleOver = SimpleOver(direction: .right)
        simpleOver.popStyle = (operation == .pop)
        return simpleOver
    }
}

【讨论】:

    【解决方案2】:

    你可以跟随,

     let sw  = revealViewController()
            self.view.window?.rootViewController = sw
            let viewControllerModelos = storyboard!.instantiateViewController(withIdentifier: "vc_catalogo_familias") as! VC_catalogo
            let navigationController = UINavigationController(rootViewController: viewControllerModelos)
            navigationController.navigationBar.isHidden=false
            navigationController.setNavigationBarHidden(true, animated: false)
         let trans = CATransition()
                trans.duration = 0.5
                trans.type = kCATransitionPush
                trans.subtype = kCATransitionFromLeft
                trans.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                sw.view.window!.layer.add(trans, forKey: kCATransition)
            sw!.setFront(navigationController, animated: true)
    

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 2018-03-07
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2018-02-27
      相关资源
      最近更新 更多