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

时间:2014-09-02 07:44:52

标签: ios ipad animation swift

我已经四处寻找答案,花了最后两个小时把我的头发拉到了尽头。

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

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

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())
    })
}

}

要呈现的代码:

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

    targetViewController.transitioningDelegate = td
    targetViewController.modalPresentationStyle = .Custom

    self.presentViewController(targetViewController, animated: true, completion: nil)

正如你所看到的,一个相当基本的动画。我在这里错过了什么吗?就像我说的那样,它表现得非常好,然后完全没有99.99%,但解雇后的视图控制器被莫名其妙地删除了。在这种情况发生后,iPad会显示一个黑屏 - 完全是黑屏。

3 个答案:

答案 0 :(得分:4)

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

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

您可能需要使用哪个视图添加回窗口,无论是取消还是取消,还是确保只在解雇而不是演示时执行此操作。

来源:Container view disappearing on completeTransition: http://joystate.wordpress.com/2014/09/02/ios8-and-custom-uiviewcontrollers-transitions/

答案 1 :(得分:2)

解雇内容视图控制器时,我遇到了同样的问题。我的应用程序有一个显示子视图控制器的父视图控制器。然后,当点击子级中的子视图时,它显示另一个vc(我将其称为内容vc)

我的问题是,在关闭contentVC时,它应该转到子VC,但是自定义转换完成后,childVC突然消失,而是显示父VC。

我为解决此问题所做的是

  1. 将parentVC呈现的childVC的.modalPresentationStyle从默认的.automatic更改为.fullscreen
  2. 然后将contentVC的.modalPresentationStyle也更改为.fullscreen

这解决了问题。但是它不会将您的子级VC显示为iOS 13中新增的卡片纸(使用.overCurrentContext或自动时)。

答案 2 :(得分:0)

有同样的问题ios 8.1

完成转换后的快速代码

if let window = UIApplication.sharedApplication().keyWindow {
    if let viewController = window.rootViewController {
        window.addSubview(viewController.view)
    }
}