使用自定义 UIViewController 动画制作动画后呈现的视图控制器消失

Joh*_*ers 5 animation ipad ios swift

我已经环顾四周寻找答案,并在过去的两个小时里把我的头发拉到了尽头。

我正在实现一个非常基本的自定义视图控制器过渡动画,它只是放大呈现的视图控制器并在呈现的视图控制器中增长。它添加了淡入淡出效果(0 到 1 alpha,反之亦然)。

它在呈现视图控制器时工作正常,但是在关闭时,它会将presenting视图控制器带回所有方式以填充屏幕,但随后它莫名其妙地消失了。在这些动画之后我没有做任何改变 alpha 或隐藏值的事情,这几乎是一个全新的项目。我已经开发 iOS 应用程序 3 年了,所以我怀疑这可能是一个错误,除非有人能找出我哪里出错了。

class FadeAndGrowAnimationController : NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
func animationControllerForPresentedController(presented: UIViewController!, presentingController presenting: UIViewController!, sourceController source: UIViewController!) -> UIViewControllerAnimatedTransitioning! {
    return self
}

func animationControllerForDismissedController(dismissed: UIViewController!) -> UIViewControllerAnimatedTransitioning! {
    return self
}

func transitionDuration(transitionContext: UIViewControllerContextTransitioning!) -> NSTimeInterval {
    return 2
}

func animateTransition(transitionContext: UIViewControllerContextTransitioning!) {
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as UIViewController
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as UIViewController

    toViewController.view.transform = CGAffineTransformMakeScale(0.5, 0.5)
    toViewController.view.alpha = 0

    transitionContext.containerView().addSubview(fromViewController.view)
    transitionContext.containerView().addSubview(toViewController.view)
    transitionContext.containerView().bringSubviewToFront(toViewController.view)

    UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: {
        fromViewController.view.transform = CGAffineTransformScale(fromViewController.view.transform, 2, 2)
        fromViewController.view.alpha = 1

        toViewController.view.transform = CGAffineTransformMakeScale(1, 1)
        toViewController.view.alpha = 1
    }, completion: { finished in
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    })
}
Run Code Online (Sandbox Code Playgroud)

}

以及要呈现的代码:

    let targetViewController = self.storyboard.instantiateViewControllerWithIdentifier("Level1ViewController") as Level1ViewController
    let td = FadeAndGrowAnimationController()

    targetViewController.transitioningDelegate = td
    targetViewController.modalPresentationStyle = .Custom

    self.presentViewController(targetViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个相当基本的动画。我在这里错过了什么吗?就像我说的那样,它表现得非常好,然后完美地消除了 99.99%,但是在消除后下面的视图控制器被莫名其妙地移除了。发生这种情况后,iPad 会显示一个空白屏幕 - 全黑。

Sie*_*ult 6

这似乎是一个 iOS8 错误。我找到了一个解决方案,但它是贫民窟。在视图应该在屏幕上但不在屏幕上的转换之后,需要像这样将它添加回窗口:

BOOL canceled = [transitionContext transitionWasCancelled];
[transitionContext completeTransition:!canceled];
if (!canceled)
    {
    [[UIApplication sharedApplication].keyWindow addSubview: toViewController.view];
    }
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑将哪个视图添加回窗口,无论是在取消还是 !canceled 中执行,并且可能确保仅在取消时执行而不是在演示时执行。

来源:容器视图在 completeTransition 上消失: http : //joystate.wordpress.com/2014/09/02/ios8-and-custom-uiviewcontrollers-transitions/