| // 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 |