UIViewControlleranimation转换在iOS8中失败

我有一个自定义的UIViewController转换 – 在iOS7中,它工作得很好。

但是,在iOS 8上运行时遇到问题。 具体来说,当呈现的视图控制器被解散时,原始视图控制器的视图完全消失 – 留下一个完全空白的屏幕。 这是我的代码:

@implementation DDCardTransition - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.5f; } - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; CGRect endFrame = self.destinationFrame; if (self.presenting) { fromViewController.view.userInteractionEnabled = NO; toViewController.view.layer.cornerRadius = 6.0f; UIView *tintAdjustmentView = [UIView new]; tintAdjustmentView.frame = fromViewController.view.frame; tintAdjustmentView.backgroundColor = [UIColor blackColor]; tintAdjustmentView.alpha = 0.f; [transitionContext.containerView addSubview:fromViewController.view]; [transitionContext.containerView addSubview:tintAdjustmentView]; [transitionContext.containerView addSubview:toViewController.view]; CGRect startFrame = endFrame; startFrame.origin.y += [UIScreen mainScreen].bounds.size.height; toViewController.view.frame = startFrame; [CATransaction begin]; [CATransaction setCompletionBlock:^{ [transitionContext completeTransition:YES]; }]; CABasicAnimation *frameAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; frameAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.1f :0.8f :0.0 :1.0]; frameAnimation.duration = [self transitionDuration:transitionContext]; frameAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMidX(startFrame), CGRectGetMidY(startFrame))]; frameAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMidX(endFrame), CGRectGetMidY(endFrame))]; toViewController.view.layer.position = [frameAnimation.toValue CGPointValue]; [toViewController.view.layer addAnimation:frameAnimation forKey:@"position"]; CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; opacityAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; opacityAnimation.duration = 0.3f; opacityAnimation.fromValue = @(0.f); opacityAnimation.toValue = @(0.5f); tintAdjustmentView.layer.opacity = [opacityAnimation.toValue floatValue]; [tintAdjustmentView.layer addAnimation:opacityAnimation forKey:@"opacity"]; [CATransaction commit]; } else { toViewController.view.userInteractionEnabled = YES; UIView *tintAdjustmentView = [UIView new]; tintAdjustmentView.frame = toViewController.view.frame; tintAdjustmentView.backgroundColor = [UIColor blackColor]; tintAdjustmentView.alpha = 0.5f; [transitionContext.containerView addSubview:toViewController.view]; [transitionContext.containerView addSubview:tintAdjustmentView]; [transitionContext.containerView addSubview:fromViewController.view]; endFrame.origin.y += [UIScreen mainScreen].bounds.size.height; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ fromViewController.view.frame = endFrame; tintAdjustmentView.alpha = 0.f; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } } @end 

任何想法为什么这不再适用于iOS8?

谢谢!

以下代码在xcode GM中工作正常:

 func animateTransition(transitionContext: UIViewControllerContextTransitioning!) { let fromViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let fromViewControllerView = transitionContext.viewForKey(UITransitionContextFromViewKey) let containerView = transitionContext.containerView() fromViewControllerView?.frame = transitionContext.finalFrameForViewController(fromViewController!) fromViewControllerView?.frame.origin.y = containerView.bounds.height containerView.addSubview(fromViewControllerView!) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: .AllowUserInteraction, animations: { fromViewControllerView!.center.y = containerView.bounds.size.height/2 }, completion: { (completed: Bool) -> Void in transitionContext.completeTransition(completed) } ) 

}