#import <Foundation/Foundation.h>
@interface
CoreAnimationEffect
: NSObject
#pragma mark - Custom Animation
+ (
void
)showAnimationType:(
NSString
*)type
withSubType
:(
NSString
*)subType
duration
:(CFTimeInterval)duration
timingFunction
:(
NSString
*)timingFunction
view
:(
UIView
*)theView;
#pragma mark - Preset Animation
+ (
void
)animationRevealFromBottom:(
UIView
*)view;
+ (
void
)animationRevealFromTop:(
UIView
*)view;
+ (
void
)animationRevealFromLeft:(
UIView
*)view;
+ (
void
)animationRevealFromRight:(
UIView
*)view;
+ (
void
)animationEaseIn:(
UIView
*)view;
+ (
void
)animationEaseOut:(
UIView
*)view;
+ (
void
)animationFlipFromLeft:(
UIView
*)view;
+ (
void
)animationFlipFromRigh:(
UIView
*)view;
+ (
void
)animationCurlUp:(
UIView
*)view;
+ (
void
)animationCurlDown:(
UIView
*)view;
+ (
void
)animationPushUp:(
UIView
*)view;
+ (
void
)animationPushDown:(
UIView
*)view;
+ (
void
)animationPushLeft:(
UIView
*)view;
+ (
void
)animationPushRight:(
UIView
*)view;
+ (
void
)animationMoveUp:(
UIView
*)view
duration
:(CFTimeInterval)duration;
+ (
void
)animationMoveDown:(
UIView
*)view
duration
:(CFTimeInterval)duration;
+ (
void
)animationMoveLeft:(
UIView
*)view;
+ (
void
)animationMoveRight:(
UIView
*)view;
+ (
void
)animationRotateAndScaleEffects:(
UIView
*)view;
+ (
void
)animationRotateAndScaleDownUp:(
UIView
*)view;
#pragma mark - Private API
+ (
void
)animationFlipFromTop:(
UIView
*)view;
+ (
void
)animationFlipFromBottom:(
UIView
*)view;
+ (
void
)animationCubeFromLeft:(
UIView
*)view;
+ (
void
)animationCubeFromRight:(
UIView
*)view;
+ (
void
)animationCubeFromTop:(
UIView
*)view;
+ (
void
)animationCubeFromBottom:(
UIView
*)view;
+ (
void
)animationSuckEffect:(
UIView
*)view;
+ (
void
)animationRippleEffect:(
UIView
*)view;
+ (
void
)animationCameraOpen:(
UIView
*)view;
+ (
void
)animationCameraClose:(
UIView
*)view;
@end
#import "CoreAnimationEffect.h"
#import <QuartzCore/QuartzCore.h>
@implementation
CoreAnimationEffect
#pragma mark - Custom Animation
+ (
void
)showAnimationType:(
NSString
*)type
withSubType
:(
NSString
*)subType
duration
:(CFTimeInterval)duration
timingFunction
:(
NSString
*)timingFunction
view
:(
UIView
*)theView
{
CATransition
*animation = [
CATransition
animation
];
animation
.delegate
=
self
;
animation
.duration
= duration;
animation
.timingFunction
= [
CAMediaTimingFunction
functionWithName
:timingFunction];
animation
.fillMode
= kCAFillModeForwards;
animation
.type
= type;
animation
.subtype
= subType;
[theView
.layer
addAnimation
:animation
forKey
:nil
];
}
#pragma mark - Preset Animation
+ (
void
)animationRevealFromBottom:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionReveal];
[animation
setSubtype
:kCATransitionFromBottom];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseIn]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationRevealFromTop:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionReveal];
[animation
setSubtype
:kCATransitionFromTop];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationRevealFromLeft:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionReveal];
[animation
setSubtype
:kCATransitionFromLeft];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationRevealFromRight:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionReveal];
[animation
setSubtype
:kCATransitionFromRight];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationEaseIn:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionFade];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseIn]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationEaseOut:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setType
:kCATransitionFade];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationFlipFromLeft:(
UIView
*)view
{
[
UIView
beginAnimations
:nil
context
:
NULL
];
[
UIView
setAnimationCurve
:UIViewAnimationCurveEaseInOut];
[
UIView
setAnimationDuration
:
0
.35f
];
[
UIView
setAnimationTransition
:
UIViewAnimationTransitionFlipFromLeft
forView
:view
cache
:
NO
];
[
UIView
commitAnimations
];
}
+ (
void
)animationFlipFromRigh:(
UIView
*)view
{
[
UIView
beginAnimations
:nil
context
:
NULL
];
[
UIView
setAnimationCurve
:UIViewAnimationCurveEaseInOut];
[
UIView
setAnimationDuration
:
0
.35f
];
[
UIView
setAnimationTransition
:
UIViewAnimationTransitionFlipFromRight
forView
:view
cache
:
NO
];
[
UIView
commitAnimations
];
}
+ (
void
)animationCurlUp:(
UIView
*)view
{
[
UIView
beginAnimations
:nil
context
:
NULL
];
[
UIView
setAnimationCurve
:UIViewAnimationCurveEaseOut];
[
UIView
setAnimationDuration
:
0
.35f
];
[
UIView
setAnimationTransition
:
UIViewAnimationTransitionCurlUp
forView
:view
cache
:
NO
];
[
UIView
commitAnimations
];
}
+ (
void
)animationCurlDown:(
UIView
*)view
{
[
UIView
beginAnimations
:nil
context
:
NULL
];
[
UIView
setAnimationCurve
:UIViewAnimationCurveEaseIn];
[
UIView
setAnimationDuration
:
0
.35f
];
[
UIView
setAnimationTransition
:
UIViewAnimationTransitionCurlDown
forView
:view
cache
:
NO
];
[
UIView
commitAnimations
];
}
+ (
void
)animationPushUp:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionPush];
[animation
setSubtype
:kCATransitionFromTop];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationPushDown:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionPush];
[animation
setSubtype
:kCATransitionFromBottom];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationPushLeft:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionPush];
[animation
setSubtype
:kCATransitionFromLeft];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationPushRight:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionPush];
[animation
setSubtype
:kCATransitionFromRight];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationMoveUp:(
UIView
*)view
duration
:(CFTimeInterval)duration
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:duration];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut]];
[animation
setType
:kCATransitionMoveIn];
[animation
setSubtype
:kCATransitionFromTop];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationMoveDown:(
UIView
*)view
duration
:(CFTimeInterval)duration
{
CATransition
*transition = [
CATransition
animation
];
transition
.duration
=
0
.4
;
transition
.timingFunction
= [
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut];
transition
.type
= kCATransitionReveal;
transition
.subtype
= kCATransitionFromBottom;
[view
.layer
addAnimation
:transition
forKey
:nil
];
}
+ (
void
)animationMoveLeft:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionMoveIn];
[animation
setSubtype
:kCATransitionFromLeft];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationMoveRight:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:kCATransitionMoveIn];
[animation
setSubtype
:kCATransitionFromRight];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+(
void
)animationRotateAndScaleEffects:(
UIView
*)view
{
[
UIView
animateWithDuration
:
0
.35f
animations
:^
{
view
.transform
= CGAffineTransformMakeScale(
0
.001
,
0
.001
);
CABasicAnimation
*animation = [
CABasicAnimation
animationWithKeyPath
:
@"transform"
];
animation
.toValue
= [
NSValue
valueWithCATransform3D
:CATransform
3
DMakeRotation(
M_PI
,
0
.70
,
0
.40
,
0
.80
)];
animation
.duration
=
0
.45
;
animation
.repeatCount
=
1
;
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
completion
:^(
BOOL
finished)
{
[
UIView
animateWithDuration
:
0
.35f
animations
:^
{
view
.transform
= CGAffineTransformMakeScale(
1
.0
,
1
.0
);
}];
}];
}
+ (
void
)animationRotateAndScaleDownUp:(
UIView
*)view
{
CABasicAnimation
*rotationAnimation = [
CABasicAnimation
animationWithKeyPath
:
@"transform.rotation.z"
];
rotationAnimation
.toValue
= [
NSNumber
numberWithFloat
:(
2
* M_PI) *
2
];
rotationAnimation
.duration
=
0
.35f
;
rotationAnimation
.timingFunction
= [
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut];
CABasicAnimation
*scaleAnimation = [
CABasicAnimation
animationWithKeyPath
:
@"transform.scale"
];
scaleAnimation
.toValue
= [
NSNumber
numberWithFloat
:
0
.0
];
scaleAnimation
.duration
=
0
.35f
;
scaleAnimation
.timingFunction
= [
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseInEaseOut];
CAAnimationGroup
*animationGroup = [
CAAnimationGroup
animation
];
animationGroup
.duration
=
0
.35f
;
animationGroup
.autoreverses
=
YES
;
animationGroup
.repeatCount
=
1
;
animationGroup
.animations
=[
NSArray
arrayWithObjects
:rotationAnimation, scaleAnimation,
nil
];
[view
.layer
addAnimation
:animationGroup
forKey
:
@"animationGroup"
];
}
#pragma mark - Private API
+ (
void
)animationFlipFromTop:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"oglFlip"
];
[animation
setSubtype
:
@"fromTop"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationFlipFromBottom:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"oglFlip"
];
[animation
setSubtype
:
@"fromBottom"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCubeFromLeft:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cube"
];
[animation
setSubtype
:
@"fromLeft"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCubeFromRight:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cube"
];
[animation
setSubtype
:
@"fromRight"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCubeFromTop:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cube"
];
[animation
setSubtype
:
@"fromTop"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCubeFromBottom:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cube"
];
[animation
setSubtype
:
@"fromBottom"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationSuckEffect:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"suckEffect"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationRippleEffect:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"rippleEffect"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCameraOpen:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cameraIrisHollowOpen"
];
[animation
setSubtype
:
@"fromRight"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
+ (
void
)animationCameraClose:(
UIView
*)view
{
CATransition
*animation = [
CATransition
animation
];
[animation
setDuration
:
0
.35f
];
[animation
setFillMode
:kCAFillModeForwards];
[animation
setTimingFunction
:[
CAMediaTimingFunction
functionWithName
:kCAMediaTimingFunctionEaseOut]];
[animation
setType
:
@"cameraIrisHollowClose"
];
[animation
setSubtype
:
@"fromRight"
];
[view
.layer
addAnimation
:animation
forKey
:nil
];
}
@end