使用UIModalPresentationCustom
关闭各种视图控制器时,视图控制器关闭后屏幕变黑,就像所有视图控制器已从视图层次结构中删除一样。
正确设置转换委托,正确地请求并传递animationControllerForPresentedController,并在动画结束后完成转换。
这个确切的代码在使用iOS 7 SDK编译时效果很好,但在使用iOS 8b5编译时会损坏
答案 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
})
}