美文网首页
iOS动画--发送礼物

iOS动画--发送礼物

作者: 江湖闹士 | 来源:发表于2024-07-21 10:28 被阅读0次

场景:直播间刷礼物时,会从发送按钮处飘一个选中的礼物到主播的头像处。
原理:找到发送按钮和主播头像所在它们共同的父视图的位置,然后进行组合动画操作

实现一个类,来完成这个功能
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface GiftAnimation : NSObject
//这个的gift可以作为外部送礼物的URL进行展示,userID可以作为唯一标识来处理特殊业务逻辑
+ (void)animationGiftWithFromRect:(CGRect)from startPoint:(CGPoint)startPoint toRect:(CGRect)to giftBean:(NSString *)gift micUser:(NSInteger)userID superView:(nonnull UIView *)aView;

@end

NS_ASSUME_NONNULL_END
#import "GiftAnimation.h"

@implementation GiftAnimation

+ (void)animationGiftWithFromRect:(CGRect)from startPoint:(CGPoint)startPoint toRect:(CGRect)to giftBean:(NSString *)gift micUser:(NSInteger)userID superView:(nonnull UIView *)aView{
    if (to.size.width == 0) {
        return;
    }
    UIImageView * contentView = [UIImageView new];
    contentView.frame = from;
    //可以使用传过来的入参进行网络图片加载,暂时用本地演示
    contentView.image = IMAGE(@"gift");
    //业务逻辑中可以使用userID作为唯一标识
    contentView.tag = userID;
    
    CGPoint endPoitnt = CGPointMake(to.origin.x+ to.size.width/2, to.origin.y + to.size.height/2);
    
    CGFloat  height = startPoint.y - endPoitnt.y;
    CGFloat  width = startPoint.x - endPoitnt.x;

    CGPoint ceterPoint1 = CGPointMake(startPoint.x - width/2, startPoint.y - height /3);
    CGPoint ceterPoint2 = CGPointMake(startPoint.x - 2*width/3, startPoint.y - 2*height /3);
    
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPoint]; // 起点
    // 设置终点 和两个控制点(拐点)
    
    [path addCurveToPoint:endPoitnt controlPoint1:ceterPoint1 controlPoint2:ceterPoint2];
    
    //第二步:创建关键帧动画
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    //pathAnimation.calculationMode = kCAAnimationPaced;// 我理解为节奏
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;// 是否在动画完成后从 Layer 层上移除  回到最开始状态
    pathAnimation.duration = 1.0f;// 动画时间
    pathAnimation.delegate = (id)aView;
    pathAnimation.repeatCount = 1;// 动画重复次数```
    pathAnimation.path = path.CGPath;
    
    ///第三步:透明动画
    CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
    opacityAnim.toValue = [NSNumber numberWithFloat:0.0];
    opacityAnim.beginTime = 1.0;
    opacityAnim.duration = 2.0;
    opacityAnim.removedOnCompletion = NO;
    opacityAnim.fillMode = kCAFillModeForwards;
    
    //动画组
    CAAnimationGroup *animGroup = [CAAnimationGroup animation];
    animGroup.animations = [NSArray arrayWithObjects:pathAnimation, opacityAnim, nil];
    animGroup.duration = 3.0;
    animGroup.delegate = (id)aView;
    animGroup.fillMode = kCAFillModeForwards;
    animGroup.removedOnCompletion = NO;
    
    
    //第四步: 添加动画
    [contentView.layer addAnimation:animGroup forKey:[NSString stringWithFormat:@"myAnimation"]];// 添加动画
    [aView addSubview:contentView];
    
    //防止UIImage只生成不销毁,占用内存,动画完实时销毁
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [contentView removeFromSuperview];
    });
}
@end

外部使用:

例子:一个发送按钮fromBtn,点击fromBtn,会从fromBtn处飘一个礼物到头像toIcon处

//获取fromBtn所在父视图的坐标位置CGRect
    CGRect fromRec = [self.fromBtn convertRect:self.fromBtn.bounds toView:self.view];
//获取礼物初始位置,即fromBtn的中心点位置
    CGPoint point = CGPointMake(fromRec.origin.x + (fromRec.size.width/2), fromRec.origin.y + (fromRec.size.height/2));
//获取toIcon所在父视图的坐标位置CGRect
    CGRect toRec = [self.toIcon convertRect:self.toIcon.bounds toView:self.view];
//调用方法,开始动画,micUser和giftBean可以根据具体业务具体处理,不需要的可以去除
    [GiftAnimation animationGiftWithFromRect:rec startPoint:point toRect:toRec giftBean:@"" micUser:32 superView:self.view];

相关文章

  • iOS 直播间礼物动画队列

    iOS 直播间礼物动画队列 https://blog.csdn.net/silence_0313/article/...

  • ios动画

    ios动画 ios动画2 ios动画3

  • iOS - 礼物连击动画

    简单结构分析: 在做礼物点击的时候,我们先把需要显示在屏幕上的礼物放入到一个容器containerView中如下图...

  • iOS 礼物动画效果

    最近项目中要使用直播功能,自然就涉及礼物效果展示。示例效果如下图 主要是解决2个问题:1.动画效果。2.送到多次礼...

  • iOS动画

    iOS动画-从UIView动画说起iOS动画-Transform和KeyFrame动画iOS动画-layout动画...

  • 《iOS动画》读书笔记·内容层动画

    《iOS动画》读书笔记·前序《iOS动画》读书笔记·显示层动画《iOS动画》读书笔记·内容层动画《iOS动画》读书...

  • 《iOS动画》读书笔记·显示层动画

    《iOS动画》读书笔记·前序《iOS动画》读书笔记·显示层动画《iOS动画》读书笔记·内容层动画《iOS动画》读书...

  • 《iOS动画》读书笔记·前序

    《iOS动画》读书笔记·前序《iOS动画》读书笔记·显示层动画《iOS动画》读书笔记·内容层动画《iOS动画》读书...

  • 《iOS动画》读书笔记·转场动画

    《iOS动画》读书笔记·前序《iOS动画》读书笔记·显示层动画《iOS动画》读书笔记·内容层动画《iOS动画》读书...

  • iOS - 转场动画

    参考文章:iOS 转场动画一张图看懂 iOS 转场动画iOS自定义转场动画 iOS 转场动画探究(一)

网友评论

      本文标题:iOS动画--发送礼物

      本文链接:https://www.haomeiwen.com/subject/ggyshjtx.html