iOS 8 – 解除视图控制器与自定义演示文稿后的屏幕空白

当closures使用UIModalPresentationCustom各种视图控制器时,屏幕在视图控制器closures后变成黑色,就好像所有的视图控制器已经从视图层次中移除一样。

转换委托设置正确,animationControllerForPresentedController请求并正确传递,一旦animation结束,转换完成。

这个确切的代码在使用iOS 7 SDK进行编译时效果很好,但是在使用iOS 8b5编译时会被破坏

这是因为你最有可能添加两个呈现

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

和提出的

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

在您的animation控制器的(void)animateTransition:(id)transitionContext方法中将视图控制器添加到您的containerView中。 由于您正在使用自定义模式演示文稿, 呈现视图控制器仍然显示在所呈现的视图控制器下方。 现在,因为它仍然可见,所以不需要将其添加到容器视图。 相反, 只能将提交的视图控制器添加到containerView。 在你的animateTransition:方法里应该看起来像这样

 UIView *containerView = [transitionContext containerView]; UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; // Boolean value to determine presentation or dismissal animation if (self.presenting){ [transitionContext.containerView addSubview:toViewController.view]; // Your presenting animation code } else { // Your dismissal animation code } 

这就是高票接受答案误导人的那种问题。 长话短。

首先 ,不要使用UIModalPresentationCustom,这听起来不像。 ( 细节 )

其次 ,在animateTransition中有一个新的方法可以从Views中检索,不要再使用类似'fromVC.view'的东西。 ( 为什么 )

 UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; //swift let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey) let toView = transitionContext.viewForKey(UITransitionContextToViewKey) 

现在黑屏应该消失了。

看来我遇到了同样的问题,我正在使用Xcode 6 beta5。

我search了谷歌,发现有其他人有这个相同的问题,他们说这是严重的iOS 8的错误,所以希望苹果可以尽快解决这个问题。

https://github.com/TeehanLax/UIViewController-Transitions-Example/issues/5

我将下面的代码添加到转换完成块,它为我修复。

 [UIView animateWithDuration:[self transitionDuration:transitionContext] animations: ^{ // Animation code } completion: ^(BOOL finished) { // More of your code // Add the following line before completing the transition [[[UIApplication sharedApplication] keyWindow] sendSubviewToBack:toViewController.view]; // Complete the transition [transitionContext completeTransition:YES]; }]; 

也许视图的层次结构是新的Xcode的错误,或者也许是有点不同的是iOS8。 此代码为我工作。 在animateTransition:transitionContext方法中closures控制器的同时添加它。

 [[UIApplication sharedApplication].keyWindow addSubview:toViewController.view]; toViewController.view.userInteractionEnabled = YES; 

快速提示:确保你的“From”UIViewController是你所期望的。

  NSLog(@" FROM vc %@" , [[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] description]); 

我的代码在过去有类似的错误。 您可以轻松地从“VC”上下文中select正确的“From”。

  UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; fromView = [[[fromVC childViewControllers] firstObject] view]; 

我有同样的问题,是什么导致了我的问题是,我没有设置toViewController的最后一帧。 请参阅http://www.appcoda.com/custom-view-controller-transitions-tutorial/中的以下示例;

 func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController) let containerView = transitionContext.containerView() let bounds = UIScreen.mainScreen().bounds toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height) containerView.addSubview(toViewController.view) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: { fromViewController.view.alpha = 0.5 toViewController.view.frame = finalFrameForVC }, completion: { finished in transitionContext.completeTransition(true) fromViewController.view.alpha = 1.0 }) }