#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface LAXAnimation : NSObject
@property (nonatomic, assign) NSTimer *timer;
+ (CATransition *)defaultAnimationWithDuration:(NSTimeInterval)duration target:(UIView *)view;
+ (CATransition *)animationWithDuration:(NSTimeInterval)duration target:(UIView *)view delegate:(id)delegate type:(NSInteger)type subtype:(NSInteger)subtype;
+ (void)addShakeGestureRecognizer:(UIView *)view;
+ (void)stopShakeWithTouchView:(UIView *)contentView shakeView:(UIView *)shakeView touches:(NSSet<UITouch *> *)touches event:(UIEvent *)event;
@end
#import "LAXAnimation.h"
@implementation LAXAnimation
+ (CATransition *)defaultAnimationWithDuration:(NSTimeInterval)duration target:(UIView *)view {
CATransition *defaultAnimation = [CATransition animation];
defaultAnimation.timingFunction = UIViewAnimationCurveEaseInOut;
defaultAnimation.duration = duration;
defaultAnimation.type = @"pageCurl";
defaultAnimation.subtype = kCATransitionFromBottom;
[view.layer addAnimation:defaultAnimation forKey:@"animation"];
return defaultAnimation;
}
+ (CATransition *)animationWithDuration:(NSTimeInterval)duration target:(UIView *)view delegate:(nullable id)delegate type:(NSInteger)type subtype:(NSInteger)subtype {
NSArray *typeArr = @[kCATransitionFade, kCATransitionPush, kCATransitionReveal, kCATransitionMoveIn, @"rippleEffect", @"suckEffect", @"oglFlip", @"cube", @"pageCurl", @"pageUnCurl", @"cameraIrisHollowOpen", @"cameraIrisHollowClose"];
NSArray *subtypeArr = @[kCATransitionFromLeft, kCATransitionFromBottom, kCATransitionFromRight, kCATransitionFromTop];
CATransition *defaultAnimation = [CATransition animation];
defaultAnimation.delegate = delegate;
defaultAnimation.duration = duration;
defaultAnimation.timingFunction = UIViewAnimationCurveEaseInOut;
if (type >= 0 && type < 12) {
defaultAnimation.type = typeArr[type];
}
if (type >= 0 && type < 4) {
defaultAnimation.subtype = subtypeArr[subtype];
}
[view.layer addAnimation:defaultAnimation forKey:@"animation"];
return defaultAnimation;
}
+ (void)addShakeGestureRecognizer:(UIView *)view {
UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
longPress.minimumPressDuration = 1;
[view addGestureRecognizer:longPress];
view.userInteractionEnabled = YES;
}
+ (void)startShake:(UIView *)view {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[animation setDuration:0.08];
animation.fromValue = @(-M_1_PI/2);
animation.toValue = @(M_1_PI/2);
animation.repeatCount = HUGE_VAL;
animation.autoreverses = YES;
view.layer.anchorPoint = CGPointMake(0.5, 0.5);
[view.layer addAnimation:animation forKey:@"rotation"];
}
+ (void)gestureAction:(UILongPressGestureRecognizer *)sender {
CABasicAnimation *animation = (CABasicAnimation *)[sender.view.layer animationForKey:@"rotation"];
if (animation == nil) {
[self startShake:sender.view];
}else {
sender.view.layer.speed = 1.0;
}
}
+ (void)stopShakeWithTouchView:(UIView *)contentView shakeView:(UIView *)shakeView touches:(NSSet<UITouch *> *)touches event:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:contentView];
CGPoint p = [contentView convertPoint:point toView:shakeView];
if (![shakeView pointInside:p withEvent:event]) {
shakeView.layer.speed = 0.0;
}
}
@end