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

时间:2014-08-31 03:05:37

标签: ios objective-c cocoa-touch uikit ios8

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

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

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

7 个答案:

答案 0 :(得分:172)

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

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

和呈现的

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

在动画控制器的(void)animateTransition:(id)transitionContext方法中查看控制器到您的containerView。由于您使用的是自定义模式演示文稿,呈现视图控制器仍显示在呈现的视图控制器下方。现在,由于它仍然可见,因此您无需将其添加到容器视图中。而仅将呈现的视图控制器添加到containerView。应该在animateTransition:method

中看起来像这样
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
}

答案 1 :(得分:18)

这是高票和高票的问题。接受回答误导人。长话短说。

首先,不要使用UIModalPresentationCustom,它听起来不像。 (detail

其次,有一种新方法可以在animateTransition中从/向视图中检索,不再使用'fromVC.view'这样的内容。 (why

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)

现在黑屏应该消失。

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

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

[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];
}];

答案 4 :(得分:2)

也许视图层次结构对于新的Xcode来说是错误的,或者它与iOS8有点不同。这段代码对我有用。在animateTransition:transitionContext方法中解除控制器时添加它。

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

答案 5 :(得分:0)

快速提示:确保您的" From" UIViewController是你期待的。

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

过去我的代码中有类似的错误。你可以很容易地找出正确的"来自" VC背景。

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

答案 6 :(得分:0)

我遇到了同样的问题,导致问题的原因是我没有设置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
    })
}