CustomTransitions/Cross Dissolve/AAPLCrossDissolveTransitionAnimator.m
/* |
Copyright (C) 2016 Apple Inc. All Rights Reserved. |
See LICENSE.txt for this sample’s licensing information |
Abstract: |
A transition animator that performs a cross dissolve transition between |
two view controllers. |
*/ |
#import "AAPLCrossDissolveTransitionAnimator.h" |
@implementation AAPLCrossDissolveTransitionAnimator |
//| ---------------------------------------------------------------------------- |
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext |
{ |
return 0.35; |
} |
//| ---------------------------------------------------------------------------- |
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext |
{ |
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; |
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; |
UIView *containerView = transitionContext.containerView; |
// For a Presentation: |
// fromView = The presenting view. |
// toView = The presented view. |
// For a Dismissal: |
// fromView = The presented view. |
// toView = The presenting view. |
UIView *fromView; |
UIView *toView; |
// In iOS 8, the viewForKey: method was introduced to get views that the |
// animator manipulates. This method should be preferred over accessing |
// the view of the fromViewController/toViewController directly. |
// It may return nil whenever the animator should not touch the view |
// (based on the presentation style of the incoming view controller). |
// It may also return a different view for the animator to animate. |
// |
// Imagine that you are implementing a presentation similar to form sheet. |
// In this case you would want to add some shadow or decoration around the |
// presented view controller's view. The animator will animate the |
// decoration view instead and the presented view controller's view will |
// be a child of the decoration view. |
if ([transitionContext respondsToSelector:@selector(viewForKey:)]) { |
fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; |
toView = [transitionContext viewForKey:UITransitionContextToViewKey]; |
} else { |
fromView = fromViewController.view; |
toView = toViewController.view; |
} |
fromView.frame = [transitionContext initialFrameForViewController:fromViewController]; |
toView.frame = [transitionContext finalFrameForViewController:toViewController]; |
fromView.alpha = 1.0f; |
toView.alpha = 0.0f; |
// We are responsible for adding the incoming view to the containerView |
// for the presentation/dismissal. |
[containerView addSubview:toView]; |
NSTimeInterval transitionDuration = [self transitionDuration:transitionContext]; |
[UIView animateWithDuration:transitionDuration animations:^{ |
fromView.alpha = 0.0f; |
toView.alpha = 1.0; |
} completion:^(BOOL finished) { |
// When we complete, tell the transition context |
// passing along the BOOL that indicates whether the transition |
// finished or not. |
BOOL wasCancelled = [transitionContext transitionWasCancelled]; |
[transitionContext completeTransition:!wasCancelled]; |
}]; |
} |
@end |
Copyright © 2016 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2016-01-28