显示的视图控制器在使用自定义UIViewController动画制作动画后消失



我四处寻找答案,在过去的两个小时里,我一直在竭尽全力。

我正在实现一个非常基本的自定义视图控制器转换动画,它只需放大呈现的视图控制器并在呈现的视图控件中增长。它添加了渐变效果(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())
    })
}

}

以及要呈现的代码:

    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会显示一个完全黑色的空白屏幕。

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

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

您可能需要考虑将哪个视图添加回窗口,是在取消还是!取消,也许要确保只在解雇时做,而不是在演示时做。

来源:容器视图在完成时消失转换:http://joystate.wordpress.com/2014/09/02/ios8-and-custom-uiviewcontrollers-transitions/

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

我的问题是,当驳回contentVC时,它应该转到子VC,但当我的自定义转换完成时,子VC突然消失,显示的是父VC。

我所做的解决这个问题的是

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

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

在ios 8.1 中遇到了同样的问题

完成转换后我的swift代码

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

最新更新