iOS常用动画的封装。如下:
(1) .h 文件
#import
@interface UIView (Animation)
@property(nonatomic,copy)void(^completeBlock)();
- (void) shakeAnimation;
- (void) springingAnimation;
- (void) trans180DegreeAnimation;
- (void) throwFrom:(CGPoint)start to:(CGPoint)end height:(CGFloat)height
duration:(CGFloat)duration completedBlock:(void(^)())completedBlock;
- (void) praiseAnimation;
@end
(2).m文件
#import "UIView+Animation.h"
#import
#import
@implementation UIView (Animation)
static const void *UtilityKey = &UtilityKey;
-(void)setCompleteBlock:(void (^)())completeBlock
{
objc_setAssociatedObject(self, &UtilityKey, completeBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(void(^)())completeBlock
{
return objc_getAssociatedObject(self, UtilityKey);
}
- (void) shakeAnimation {
CALayer* layer = [self layer];
CGPoint position = [layer position];
CGPoint y = CGPointMake(position.x - 8.0f, position.y);
CGPoint x = CGPointMake(position.x + 8.0f, position.y);
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setFromValue:[NSValue valueWithCGPoint:x]];
[animation setToValue:[NSValue valueWithCGPoint:y]];
[animation setAutoreverses:YES];
[animation setDuration:0.08f];
[animation setRepeatCount:3];
[layer addAnimation:animation forKey:nil];
}
- (void) springingAnimation
{
CAKeyframeAnimation *popAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
popAnimation.duration = 0.4;
popAnimation.values = @[[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.01f, 0.01f, 1.0f)],
[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1f, 1.1f, 1.0f)],
[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9f, 0.9f, 1.0f)],
[NSValue valueWithCATransform3D:CATransform3DIdentity]];
popAnimation.keyTimes = @[@0.2f, @0.5f, @0.75f, @1.0f];
popAnimation.timingFunctions = @[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[self layer] addAnimation:popAnimation forKey:nil];
}
- (void) trans180DegreeAnimation
{
[UIView animateWithDuration:0.3 animations:^{
self.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
}];
// CABasicAnimation *animation = [CABasicAnimation
// animationWithKeyPath: @"transform" ];
// animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
//
// //围绕Z轴旋转,垂直与屏幕
// animation.toValue = [NSValue valueWithCATransform3D:
//
// CATransform3DMakeRotation(M_PI, 0.0, 0.0, 1.0) ];
// animation.duration = 0.4;
//
// [self.layer addAnimation:animation forKey:nil];
}
- (void) throwFrom:(CGPoint)start to:(CGPoint)end height:(CGFloat)height
duration:(CGFloat)duration completedBlock:(void(^)())completedBlock
{
self.completeBlock=completedBlock;
//初始化抛物线path
CGMutablePathRef path = CGPathCreateMutable();
CGFloat cpx = (start.x + end.x) / 2;
NSLog(@"最高点为%lf",height);
CGFloat cpy = height;
CGPathMoveToPoint(path, NULL, start.x, start.y);
CGPathAddQuadCurveToPoint(path, NULL, cpx, cpy, end.x, end.y);
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.path = path;
CFRelease(path);
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.autoreverses = YES;
scaleAnimation.toValue = [NSNumber numberWithFloat:(CGFloat)((arc4random() % 4) + 4) / 10.0];
CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
groupAnimation.repeatCount = 0;
groupAnimation.delegate = self;
groupAnimation.duration = duration;
groupAnimation.removedOnCompletion = YES;
groupAnimation.animations = @[scaleAnimation, animation];
[self.layer addAnimation:groupAnimation forKey:@"position scale"];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if (self.completeBlock && flag) {
self.completeBlock();
}
}
- (void)praiseAnimation
{
CAKeyframeAnimation *praiseAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
praiseAnimation.values = @[@(0.1),@(1.0),@(1.5)];
praiseAnimation.keyTimes = @[@(0.0),@(0.5),@(0.8),@(1.0)];
praiseAnimation.calculationMode = kCAAnimationLinear;
[self.layer addAnimation:praiseAnimation forKey:@"praiseAnimation"];
}
@end