// Copyright 2016 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/common/material_timing.h"
namespace {
UIViewAnimationOptions AnimationOptionsForceLinearTiming(
UIViewAnimationOptions options) {
// Remove any non-linear timing options from `options`. They should be
// ignored.
options &=
~(UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionCurveEaseIn |
UIViewAnimationOptionCurveEaseOut);
// Since default is EaseInOut, ensure linear is specified instead so the outer
// timing function works as expected.
options |= UIViewAnimationOptionCurveLinear;
return options;
}
// Constant to slow down animations during development.
// Since iOS Simulator's "Debug > Slow Animations" doesn't apply to
// CAAnimations, modify this multiplier here in code to run with slower/faster
// Material animations.
const NSTimeInterval kSlowAnimationModifier = 1;
} // namespace
const CGFloat kMaterialDuration0 = 0 * kSlowAnimationModifier;
const CGFloat kMaterialDuration1 = 0.25 * kSlowAnimationModifier;
const CGFloat kMaterialDuration2 = 0.1 * kSlowAnimationModifier;
const CGFloat kMaterialDuration3 = 0.35 * kSlowAnimationModifier;
const CGFloat kMaterialDuration4 = 0.05 * kSlowAnimationModifier;
const CGFloat kMaterialDuration5 = 0.5 * kSlowAnimationModifier;
const CGFloat kMaterialDuration6 = 0.15 * kSlowAnimationModifier;
const CGFloat kMaterialDuration7 = 0.4 * kSlowAnimationModifier;
const CGFloat kMaterialDuration8 = 0.07 * kSlowAnimationModifier;
CAMediaTimingFunction* MaterialTransformCurve2() {
return [[CAMediaTimingFunction alloc] initWithControlPoints:
0.0f:
0.84f:
0.13f:0.99f];
}
CAMediaTimingFunction* MaterialTimingFunction(MaterialCurve curve) {
switch (curve) {
case MaterialCurveEaseInOut:
// This curve is slow both at the beginning and end.
// Visualization of curve http://cubic-bezier.com/#.4,0,.2,1
return [[CAMediaTimingFunction alloc] initWithControlPoints:
0.4f:
0.0f:
0.2f:1.0f];
case MaterialCurveEaseOut:
// This curve is slow at the end.
// Visualization of curve http://cubic-bezier.com/#0,0,.2,1
return [[CAMediaTimingFunction alloc] initWithControlPoints:
0.0f:
0.0f:
0.2f:1.0f];
case MaterialCurveEaseIn:
// This curve is slow at the beginning.
// Visualization of curve http://cubic-bezier.com/#.4,0,1,1
return [[CAMediaTimingFunction alloc] initWithControlPoints:
0.4f:
0.0f:
1.0f:1.0f];
case MaterialCurveLinear:
// This curve is linear.
return
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
}
}
@implementation UIView (CrMaterialAnimations)
+ (void)cr_animateWithDuration:(NSTimeInterval)duration
delay:(NSTimeInterval)delay
materialCurve:(MaterialCurve)materialCurve
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion {
[CATransaction begin];
[CATransaction
setAnimationTimingFunction:MaterialTimingFunction(materialCurve)];
[UIView animateWithDuration:duration
delay:delay
options:AnimationOptionsForceLinearTiming(options)
animations:animations
completion:completion];
[CATransaction commit];
}
@end