如何创建自定义的“水平翻转”推送模式,如用于模式搜索的模式?

Swi*_*yJD 4 uinavigationcontroller ios segue swift

我正在尝试实现类似于以下内容:

翻转

但在导航控制器内部具有推送功能。有没有办法做到这一点?

Lum*_*lxk 5

我已经在几个月前做到了。
1.自定义您的过渡。例如,这是Push(例如Pop):

class BWFlipTransionPush: NSObject, UIViewControllerAnimatedTransitioning {

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

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! // as! UBPasswordLoginViewController
        let container = transitionContext.containerView()
        container!.addSubview(toVC.view)
        container!.bringSubviewToFront(fromVC!.view)

        //??m34
        var transfrom = CATransform3DIdentity
        transfrom.m34 = -0.002
        container!.layer.sublayerTransform = transfrom

        //??anrchPoint ? position
        let initalFrame = transitionContext.initialFrameForViewController(fromVC!)
        toVC.view.frame = initalFrame
        fromVC!.view.frame = initalFrame
        toVC.view.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI_2), 0, 1, 0)



        //??
        UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
                fromVC!.view.layer.transform = CATransform3DMakeRotation(CGFloat(-M_PI_2), 0, 1, 0)
            }) { (finished: Bool) -> Void in
                container?.bringSubviewToFront(toVC.view)
                UIView.animateWithDuration(self.transitionDuration(transitionContext), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
                    toVC.view.layer.transform = CATransform3DIdentity
                }) { (finished: Bool) -> Void in

                    fromVC!.view.layer.transform = CATransform3DIdentity
                    transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
                }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2.为导航控制器设置委托,如下所示:

  override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.delegate = self
    }
Run Code Online (Sandbox Code Playgroud)

3.实现委托功能:

func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    switch operation {
    case .Pop:
        return nil // you should return customized pop
    case .Push:
        return BWFlipTransionPush()
    default:
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

更新
这里是弹出:

class BWFlipTransionPop: NSObject, UIViewControllerAnimatedTransitioning {

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

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! // as! UBPasswordLoginViewController
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let container = transitionContext.containerView()
        container!.addSubview(toVC!.view)

        //??m34
        var transfrom = CATransform3DIdentity
        transfrom.m34 = -0.002
        container!.layer.sublayerTransform = transfrom

        //??anrchPoint ? position
        let initalFrame = transitionContext.initialFrameForViewController(fromVC)
        toVC!.view.frame = initalFrame
        toVC!.view.layer.transform = CATransform3DMakeRotation(CGFloat(-M_PI_2), 0, 1, 0)


        //??
        UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
            fromVC.view.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI_2), 0, 1, 0)
        }) { (finished: Bool) -> Void in
            container?.bringSubviewToFront(toVC!.view)
            UIView.animateWithDuration(self.transitionDuration(transitionContext), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
                toVC!.view.layer.transform = CATransform3DIdentity
            }) { (finished: Bool) -> Void in


                fromVC.view.layer.transform = CATransform3DIdentity
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
            }

        }

    }
}
Run Code Online (Sandbox Code Playgroud)