步骤如下:
1.新建一个类WYSShoppingCartAnimationTool, 继承NSObject:
.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface WYSShoppingCartAnimationTool : NSObject
/**
加入购物车的动画效果
@param goodsImage 商品图片
@param startPoint 动画起点
@param endPoint 动画终点
@param completion 动画执行完成后的回调
*/
+ (void)addToShoppingCartWithGoodsImage:(UIImage *)goodsImage
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint
completion:(void (^)(BOOL finished))completion;
@end
.m实现:
#import "WYSShoppingCartAnimationTool.h"
@implementation WYSShoppingCartAnimationTool
/**
加入购物车的动画效果
@param goodsImage 商品图片
@param startPoint 动画起点
@param endPoint 动画终点
@param completion 动画执行完成后的回调
*/
+ (void)addToShoppingCartWithGoodsImage:(UIImage *)goodsImage startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint completion:(void (^)(BOOL))completion{
//------- 创建shapeLayer -------//
CAShapeLayer *animationLayer = [[CAShapeLayer alloc] init];
animationLayer.frame = CGRectMake(startPoint.x - 20, startPoint.y - 20, 40, 40);
animationLayer.contents = (id)goodsImage.CGImage;
// 获取window的最顶层视图控制器
UIViewController *rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
UIViewController *parentVC = rootVC;
while ((parentVC = rootVC.presentedViewController) != nil ) {
rootVC = parentVC;
}
while ([rootVC isKindOfClass:[UINavigationController class]]) {
rootVC = [(UINavigationController *)rootVC topViewController];
}
//------ 添加layer到顶层视图控制器上------//
[rootVC.view.layer addSublayer:animationLayer];
//------- 创建移动轨迹 -------//
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:startPoint];
[movePath addQuadCurveToPoint:endPoint controlPoint:CGPointMake(200 / WYSScreenWidth * WYSScreenWidth,(WYSScreenHeight - 280 / WYSScreenHeight * WYSScreenHeight))];
// 轨迹动画
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGFloat durationTime = 0.5; // 动画时间1秒
pathAnimation.duration = durationTime;
pathAnimation.removedOnCompletion = NO;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.path = movePath.CGPath;
//------- 创建缩小动画 -------//
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.fromValue = [NSNumber numberWithFloat:1.0];
scaleAnimation.toValue = [NSNumber numberWithFloat:0.5];
scaleAnimation.duration = 0.5;
scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
scaleAnimation.removedOnCompletion = NO;
scaleAnimation.fillMode = kCAFillModeForwards;
// 添加轨迹动画
[animationLayer addAnimation:pathAnimation forKey:nil];
// 添加缩小动画
[animationLayer addAnimation:scaleAnimation forKey:nil];
//------- 动画结束后执行 -------//
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(durationTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[animationLayer removeFromSuperlayer];
completion(YES);
});
}
@end
效果图:

QQ201.gif
网友评论