// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/shared/ui/util/page_animation_util.h"
#import "ios/chrome/browser/shared/ui/util/animation_util.h"
#import "ios/chrome/common/material_timing.h"
namespace {
// When animating out, a card shrinks slightly.
const CGFloat kAnimateOutScale = 0.7;
const CGFloat kAnimateOutAnchorX = 0.9;
const CGFloat kAnimateOutAnchorY = 0;
} // namespace
namespace page_animation_util {
void UpdateLayerAnchorWithTransform(CALayer* layer,
CGPoint newAnchor,
CGAffineTransform transform) {
CGSize size = layer.bounds.size;
CGPoint oldAnchor = layer.anchorPoint;
CGPoint newCenter =
CGPointMake(size.width * newAnchor.x, size.height * newAnchor.y);
CGPoint oldCenter =
CGPointMake(size.width * oldAnchor.x, size.height * oldAnchor.y);
newCenter = CGPointApplyAffineTransform(newCenter, transform);
oldCenter = CGPointApplyAffineTransform(oldCenter, transform);
CGPoint position = layer.position;
position.x = position.x - oldCenter.x + newCenter.x;
position.y = position.y - oldCenter.y + newCenter.y;
layer.position = position;
layer.anchorPoint = newAnchor;
}
void AnimateOutWithCompletion(UIView* view, void (^completion)(void)) {
// The close animation spec calls for the anchor point to be the upper right.
CGPoint newAnchorPoint = CGPointMake(kAnimateOutAnchorX, kAnimateOutAnchorY);
CALayer* layer = [view layer];
UpdateLayerAnchorWithTransform(layer, newAnchorPoint, view.transform);
[CATransaction begin];
if (completion) {
[CATransaction setCompletionBlock:completion];
}
[CATransaction setAnimationDuration:kMaterialDuration6];
CAMediaTimingFunction* timing = MaterialTimingFunction(MaterialCurveEaseIn);
[CATransaction setAnimationTimingFunction:timing];
CABasicAnimation* scaleAnimation =
[CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D transform = CATransform3DScale(
layer.transform, kAnimateOutScale, kAnimateOutScale, 1);
[scaleAnimation setToValue:[NSValue valueWithCATransform3D:transform]];
CABasicAnimation* fadeAnimation =
[CABasicAnimation animationWithKeyPath:@"opacity"];
[fadeAnimation setFromValue:[NSNumber numberWithFloat:[layer opacity]]];
[fadeAnimation setToValue:@0];
[layer addAnimation:AnimationGroupMake(@[ scaleAnimation, fadeAnimation ])
forKey:@"animateOut"];
[CATransaction commit];
}
} // namespace page_animation_util