#import "Solo_Cart_Methon.h" #define Screen_W [UIScreen mainScreen].bounds.size.width #define Screen_H [UIScreen mainScreen].bounds.size.height @interface Solo_Cart_Methon() { CALayer *_layer; } @property(nonatomic,strong)CALayer *layer; @property(nonatomic,strong)UIBezierPath *path; @end @implementation Solo_Cart_Methon +(void)startAnimationWithRect:(CGRect)rect ImageView:(UIImageView *)imageView donghua_view:(UIView*)donghua_view super_view:(UIView*)super_view end_point:(CGPoint)end_point end_view:(UIView*)end_view { Solo_Cart_Methon *solo_cart_methon = [Solo_Cart_Methon new]; solo_cart_methon.donghua_view = donghua_view; solo_cart_methon.super_view = super_view; solo_cart_methon.end_point = end_point; solo_cart_methon.end_view = end_view; [solo_cart_methon startAnimationWithRect:rect ImageView:imageView]; } -(void)startAnimationWithRect:(CGRect)rect ImageView:(UIImageView *)imageView { if (!_layer) { _layer = [CALayer layer]; _layer.contents = (id)imageView.layer.contents; _layer.contentsGravity = kCAGravityResizeAspectFill; _layer.bounds = rect; [_layer setCornerRadius:CGRectGetHeight([_layer bounds]) / 2]; _layer.masksToBounds = YES; _layer.position = CGPointMake(imageView.center.x, CGRectGetMidY(rect)+64); [self.super_view.layer addSublayer:_layer]; self.path = [UIBezierPath bezierPath]; [self.path moveToPoint:_layer.position]; // the track you can custom // point-> point1 ->point2 [self.path addCurveToPoint:self.end_point controlPoint1:CGPointMake(Screen_W/4,self.end_point.y+50) controlPoint2:CGPointMake(self.end_point.x-50, self.end_point.y-50)]; } [self groupAnimation]; } -(void)groupAnimation { self.donghua_view.userInteractionEnabled = NO; CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; animation.path = _path.CGPath; animation.rotationMode = kCAAnimationRotateAuto; CABasicAnimation *expandAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; expandAnimation.duration = 0.2f; expandAnimation.fromValue = [NSNumber numberWithFloat:1]; expandAnimation.toValue = [NSNumber numberWithFloat:0.8f]; expandAnimation.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; CABasicAnimation *narrowAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; narrowAnimation.beginTime = 0.2f; narrowAnimation.duration = 0.5f; narrowAnimation.fromValue = [NSNumber numberWithFloat:0.8f]; narrowAnimation.toValue = [NSNumber numberWithFloat:0.3f]; narrowAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; CAAnimationGroup *groups = [CAAnimationGroup animation]; groups.animations = @[animation,expandAnimation,narrowAnimation]; groups.duration = 0.7; groups.removedOnCompletion=NO; groups.fillMode=kCAFillModeForwards; groups.delegate = self; [_layer addAnimation:groups forKey:@"group"]; } -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { if (anim == [_layer animationForKey:@"group"]) { self.donghua_view.userInteractionEnabled = YES; [_layer removeFromSuperlayer]; _layer = nil; CATransition *animation = [CATransition animation]; animation.duration = 0.25f; CABasicAnimation *shakeAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; shakeAnimation.duration = 0.25f; shakeAnimation.fromValue = [NSNumber numberWithFloat:-5]; shakeAnimation.toValue = [NSNumber numberWithFloat:5]; shakeAnimation.autoreverses = YES; [self.end_view.layer addAnimation:shakeAnimation forKey:nil]; } } @end