2014-09-02 76 views
3

我环顾四周寻找答案,并花了最后两个小时将我的头发拉到了最后。在使用自定义UIViewController动画的动画后呈现的视图控制器消失

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

当呈现视图控制器时它可以正常工作,但是当解散时,它会将视图控制器全部重新填满屏幕,但随后它会莫名其妙地消失。在这些动画改变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会显示一个黑屏 - 完全黑屏。

+0

后?因为我遇到了同样的错误,并且它在Xcode 5上适用于我。 – Siegfoult 2014-09-15 16:15:15

回答

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

“贫民窟”甚至没有接近描述此修复程序,但它适用于我。 – Thompson 2014-09-18 18:13:54

+0

作为替代方案,您可以通过segue展示它,并在prepareForSegue中设置转换代理。这样动画对我来说完成得很好。 – 2015-05-29 16:57:02

+0

当视图控制器出现后发生转换时,我遇到了这个问题。调用dismissViewControllerAnimated:不起作用可能是因为视图不在预期的位置。 – greg 2015-10-26 00:48:04

-1

了您正在使用的Xcode 6同样的问题IOS 8.1

我的SWIFT代码completeTransition

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

不幸的是,这并没有为我工作,完成后toView的背景是黑色的,这意味着呈现视图控制器正在被删除。 – Midas 2016-08-08 20:06:19