商品添加购物车实现动画效果




在应用商场的时候,发现淘宝和京东在往购物车添加商品时,会有商品缩略图跑到购物车的效果,特此做了个小Demo,便于学习和应用

在controller的.h文件中

@interface ViewController ()
@property (nonatomic,strong) UIBezierPath *path;
@end

@implementation ViewController
{
    UILabel *_badgeLabel;
    NSInteger _badgeNum;
    UIImageView *_imageView;
    UIButton *_addGoods;
    CALayer *_layer;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _badgeNum = 0;
    [self setUI];
}

- (void)setUI
{
    UIColor *customColor = [UIColor colorWithRed:0.9634 green:0.3165 blue:0.3962 alpha:1.0];
    _addGoods = [UIButton buttonWithType:UIButtonTypeCustom];
    _addGoods.frame = CGRectMake(50, 300, 100, 50);
    _addGoods.timeInterVal = 3;
    [_addGoods setTitle:@"立即抢购" forState:UIControlStateNormal];
    [_addGoods setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    _addGoods.titleLabel.font = [UIFont boldSystemFontOfSize:15];
    [_addGoods setBackgroundColor:customColor];
    [_addGoods addTarget:self action:@selector(startAnimation) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_addGoods];
    _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    _imageView.image = [UIImage imageNamed:@"TabCartSelected"];
    _imageView.center = CGPointMake(270, 320);
    [self.view addSubview:_imageView];

    // label
    _badgeLabel = [[UILabel alloc] initWithFrame:CGRectMake(280, 295, 20, 20)];
    _badgeLabel.textColor = customColor;
    _badgeLabel.textAlignment = NSTextAlignmentCenter;
    _badgeLabel.font = [UIFont boldSystemFontOfSize:13];
    _badgeLabel.backgroundColor = [UIColor whiteColor];
    _badgeLabel.layer.cornerRadius = CGRectGetHeight(_badgeLabel.bounds)/2;
    _badgeLabel.layer.masksToBounds = YES;
    _badgeLabel.layer.borderWidth = 1.0f;
    _badgeLabel.layer.borderColor = customColor.CGColor;
    [self.view addSubview:_badgeLabel];
    if (_badgeNum == 0) {
        _badgeLabel.hidden = YES;
    }
    self.path = [UIBezierPath bezierPath];
    [_path moveToPoint:CGPointMake(50, 150)];
    [_path addQuadCurveToPoint:CGPointMake(270, 300) controlPoint:CGPointMake(150, 20)];
}

- (void)startAnimation
{
    if (!_layer) {
//        _addGoods.enabled = NO;
        _layer = [CALayer layer];
        _layer.contents = (__bridge id)[UIImage imageNamed:@"3"].CGImage;
        _layer.contentsGravity = kCAGravityResizeAspectFill;
        _layer.bounds = CGRectMake(0, 0, 50, 50);
        [_layer setCornerRadius:CGRectGetHeight([_layer bounds])/2];
        _layer.masksToBounds = YES;
        _layer.position = CGPointMake(50, 150);
        [self.view.layer addSublayer:_layer];
    }
    [self groupAnimation];
}

- (void)groupAnimation
{
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.path = _path.CGPath;
    animation.rotationMode = kCAAnimationRotateAuto;
    CABasicAnimation *expandAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    expandAnimation.duration = 0.5f;
    expandAnimation.fromValue = [NSNumber numberWithFloat:1];
    expandAnimation.toValue = [NSNumber numberWithFloat:1.5f];
    expandAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    
    CABasicAnimation *narrowAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    narrowAnimation.beginTime = 0.5;
    narrowAnimation.fromValue = [NSNumber numberWithFloat:1.5f];
    narrowAnimation.duration = 1.5f;
    narrowAnimation.toValue = [NSNumber numberWithFloat:0.5f];
    
    narrowAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    
    CAAnimationGroup *groups = [CAAnimationGroup animation];
    groups.animations = @[animation,expandAnimation,narrowAnimation];
    groups.duration = 2.0f;
    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"]) {
//        _addGoods.enabled = YES;
        [_layer removeFromSuperlayer];
        _layer = nil;
        _badgeNum ++;
        if (_badgeNum) {
            _badgeLabel.hidden = NO;
        }
        CATransition *animation = [CATransition animation];
        animation.duration = 0.25f;
        _badgeLabel.text = [NSString stringWithFormat:@"%ld",_badgeNum];
        [_badgeLabel.layer addAnimation:animation forKey:nil];
        CABasicAnimation *shakeAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
        shakeAnimation.duration = 0.25f;
        shakeAnimation.fromValue = [NSNumber numberWithFloat:-5];
        shakeAnimation.toValue = [NSNumber numberWithFloat:5];
        shakeAnimation.autoreverses = YES;
        [_imageView.layer addAnimation:shakeAnimation forKey:nil];
    }
}

demo中还用runtime写了下防止button连续点击的操作,需要的可以查看下载


 github连接: https://github.com/Raymon-lau/AddshoppingCart

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值