我已经四处寻找答案,花了最后两个小时把我的头发拉到了尽头。
我实现了一个非常基本的自定义视图控制器转换动画,它只是放大呈现视图控制器并在呈现的视图控制器中增长。它增加了淡入淡出效果(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会显示一个黑屏 - 完全是黑屏。
答案 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。
我为解决此问题所做的是
.modalPresentationStyle
从默认的.automatic
更改为.fullscreen
。 .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)
}
}