blob: 56aa1b8e6468a3b29de5d22371e199acb186a631 [file] [log] [blame] [edit]
// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import "MDCFeatureHighlightAnimationController.h"
#import "MDCFeatureHighlightView+Private.h"
const NSTimeInterval kMDCFeatureHighlightPresentationDuration = 0.35;
const NSTimeInterval kMDCFeatureHighlightDismissalDuration = 0.2;
@implementation MDCFeatureHighlightAnimationController
- (NSTimeInterval)transitionDuration:
(nullable __unused id<UIViewControllerContextTransitioning>)transitionContext {
if (self.presenting) {
return kMDCFeatureHighlightPresentationDuration;
} else {
return kMDCFeatureHighlightDismissalDuration;
}
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
UIViewController *toViewController =
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
MDCFeatureHighlightView *highlightView = nil;
if ([fromView isKindOfClass:[MDCFeatureHighlightView class]]) {
highlightView = (MDCFeatureHighlightView *)fromView;
} else if ([toView isKindOfClass:[MDCFeatureHighlightView class]]) {
highlightView = (MDCFeatureHighlightView *)toView;
}
if (self.presenting) {
[transitionContext.containerView addSubview:toView];
toView.frame = [transitionContext finalFrameForViewController:toViewController];
}
NSTimeInterval transitionDuration = [self transitionDuration:transitionContext];
[highlightView layoutIfNeeded];
if (self.presenting) {
[highlightView animateDiscover:transitionDuration];
} else {
switch (self.dismissStyle) {
case MDCFeatureHighlightDismissAccepted:
[highlightView animateAccepted:transitionDuration];
break;
case MDCFeatureHighlightDismissRejected:
[highlightView animateRejected:transitionDuration];
break;
}
}
[UIView animateWithDuration:transitionDuration
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
// We have to perform an animation on highlightView in this block or else UIKit
// will not know we are performing an animation and will call the completion block
// immediately, causing our CAAnimations to be cut short.
if (self.presenting) {
[highlightView layoutAppearing];
} else {
[highlightView layoutDisappearing];
}
}
completion:^(__unused BOOL finished) {
// If we're dismissing, remove the highlight view from the hierarchy
if (!self.presenting) {
[fromView removeFromSuperview];
}
[transitionContext completeTransition:YES];
}];
}
@end