执行UIViewControllerAnimatedTransitioning时隐藏快照视图

时间:2018-02-18 14:07:28

标签: ios animation uiviewcontroller

我正在尝试在推送UIViewController时进行简单的动画转换,但似乎我错过了一些东西。

我将子视图的快照从fromViewController动画到toViewController。我正在设置快照框架的动画,但快照在整个动画期间都是不可见的。

这是一个简单的代码示例。我试图将单个UILabel从第一个控制器动画到第二个控制器。我特别想要为从toViewConroller而不是fromViewController获取的快照设置动画。

@suppress

我想快照是隐藏的,因为将animatedToView的alpha设置为0,但我不知道如何在不设置的情况下实现该动画。

1 个答案:

答案 0 :(得分:1)

我尝试了你的代码工作正常。我改变了一些像初始帧硬编码的东西,所以我可以看到效果,也来自viewController alpha。

::::::用于呈现视图控制器

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    let fromVC = transitionContext.viewController(forKey: .from) as! ViewController
    let toVC   = transitionContext.viewController(forKey: .to)   as! SecondViewController

    let container = transitionContext.containerView

    toVC.view.frame = fromVC.view.frame
    container.addSubview(toVC.view)
    toVC.view.layoutIfNeeded()

    let animatedFromView = fromVC.view!
    let animatedToView = toVC.view!

    let initialFrame = container.convert(CGRect(x: 0, y: 200, width: 100, height: 100),
                                         from: animatedFromView.superview)
    let finalFame = container.convert(animatedToView.frame,
                                      to: animatedToView.superview)

    let snapshot = animatedToView.snapshotView(afterScreenUpdates: true)!
    snapshot.frame = initialFrame

    container.addSubview(snapshot)

    animatedFromView.alpha = 1
    animatedToView.alpha = 0

    UIView.animate(withDuration: 2,
                   animations: {
                    snapshot.frame = finalFame

    }) { (_) in
        snapshot.removeFromSuperview()

        fromVC.view.alpha = 1
        toVC.view.alpha = 1

        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
}

::::::::::::::::: 在推动视图控制器时使用

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let fromView = transitionContext.view(forKey: UITransitionContextViewKey.from) else { return }
    guard let toView = transitionContext.view(forKey: UITransitionContextViewKey.to) else { return }

    let container = transitionContext.containerView

    container.insertSubview(toView, belowSubview: fromView)

    let animatedFromView = fromView
    let animatedToView = toView

    let initialFrame = container.convert(CGRect(x: 0, y: 200, width: 100, height: 100),
                                         from: animatedFromView.superview)

    let finalFame = container.convert(animatedToView.frame,
                                      to: animatedToView.superview)

    let snapshot = animatedToView.snapshotView(afterScreenUpdates: true)!
    snapshot.frame = initialFrame

    container.addSubview(snapshot)

    animatedFromView.alpha = 1
    animatedToView.alpha = 1

    UIView.animate(withDuration: 2,
                   animations: {
                    snapshot.frame = finalFame

    }) { (_) in
        snapshot.removeFromSuperview()

        //fromVC.view.alpha = 1
        //toVC.view.alpha = 1

        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
}