在iOS 7中的UINavigationController上推送视图时,如何交叉溶解?

use*_*697 13 cocoa-touch ios

如果我只是调用push方法:

[self.navigationController pushViewController:viewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

然后它使用推动画.如何更改它以使用交叉溶解动画,就像我可以使用模态segue?

mic*_*els 21

您可以使用此答案中CATransition演示的:

CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:viewController animated:NO];
Run Code Online (Sandbox Code Playgroud)

  • 如果将动画设置为“否”,则将禁用滑动(推动)动画,因此它确实可以正常工作 (2认同)

Jan*_*orf 12

我使用扩展名来轻松重用:

extension UINavigationController {
    func fadeTo(_ viewController: UIViewController) {
        let transition: CATransition = CATransition()
        transition.duration = 0.3
        transition.type = kCATransitionFade
        view.layer.add(transition, forKey: nil)
        pushViewController(viewController, animated: false)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意动画是如何虚假的; 当您将其设置为true时,您仍会看到标准的"推送"动画(从右到左).


Gin*_*ane 7

UINavigationControllerDelegate协议有一个方法可以返回一个自定义的UIViewControllerAnimatedTransitioning对象,该对象将控制转换中涉及的两个视图控制器之间的动画.

创建一个Animator类来控制交叉溶解过渡:

class Animator: NSObject, UIViewControllerAnimatedTransitioning {

    let animationDuration = 0.25

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
        toVC?.view.alpha = 0.0
        let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
        transitionContext.containerView.addSubview(fromVC!.view)
        transitionContext.containerView.addSubview(toVC!.view)

        UIView.animate(withDuration: animationDuration, animations: {
            toVC?.view.alpha = 1.0
        }) { (completed) in
            fromVC?.view.removeFromSuperview()
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的UINavigationControllerDelegate中提供它:

func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return Animator()
}
Run Code Online (Sandbox Code Playgroud)

这是一个更深入的教程:http://blog.rinatkhanov.me/ios/transitions.html

  • 感谢您提供高级(非核心图形)方法。fromVC?.view.removeFromSuperview() 虽然把我搞砸了。我摆脱了这一点:在转换回来时,演示者的观点可以预见是空白的 (2认同)

Ben*_*erd 6

SWIFT 3,4.2-截至2019年10月

let transition = CATransition()
transition.duration = 0.5
transition.type = kCATransitionFade
self.navigationController?.view.layer.add(transition, forKey:nil)
Run Code Online (Sandbox Code Playgroud)