iOS 8 - 使用自定义演示文稿解除视图控制器后屏幕空白

jag*_*cow 66 cocoa-touch objective-c uikit ios ios8

当使用时关闭各种视图控制器时UIModalPresentationCustom,在取消视图控制器后屏幕变为黑色,就像所有视图控制器已从视图层次结构中删除一样.

正确设置了转换委托,正确地请求并传递了animationControllerForPresentedController,并在动画结束后完成转换.

这个确切的代码在使用iOS 7 SDK编译时非常有效,但在使用iOS 8b5编译时会破坏

Sco*_*ser 178

这是因为您最有可能同时添加两个演示文稿

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

和提出的

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

在动态控制器的(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
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,应该被接受.iOS 7中有一个错误,他们在iOS 8中修复了这个错误.上面的解决方案在iOS 7和8上完美运行.感谢DJSK指出这一点,花了一些时间搞清楚我如何得到一个空白屏幕. (11认同)
  • 显然这不是正确答案 - 根据`UIViewControllerContextTransitioning`标题,我们应该使用`-viewForKey`方法来获取视图.不幸的是,"UIModalPresentationCustom"的呈现风格导致`-viewForkey`在某些情况下返回nil,这显然是理想的行为....查看`bcherry`的回答[here](http://stackoverflow.com /问题/ 24338700)/使用-uiviewcontrollercontexttransitioning从 - 视图 - 控制器消失-. (3认同)

Lcs*_*sky 20

这是一个高票和被接受的答案误导人们的问题.长话短.

首先,不要使用UIModalPresentationCustom,它听起来不像.(详细)

其次,有一种新的方法可以在animateTransition中从/向视图中检索,不再使用像'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)
Run Code Online (Sandbox Code Playgroud)

现在黑屏应该消失.


bil*_*bai 5

我似乎遇到了同样的问题,我正在使用Xcode 6 beta5.

我在Google上搜索过,发现其他人也有同样的问题,他们说这是iOS 8中的一个严重错误,所以希望Apple能尽快解决这个问题.

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

  • 这不是Xcode或iOS 8中的错误.正确的解决方案由DJSK提供. (3认同)