金额跳动动画效果

作者: Dwyane_Coding | 来源:发表于2018-07-23 15:47 被阅读394次
    金额跳动效果

    前言

    金额效果,因为觉得公司目前的金额太乏味,决定加点效果,也特此写了个小demo,代码非常简单,贴代码方便大家看看

    通过 runtime 建立属性(setter/getter方法)

    /** 由于分类中要添加属性,所以通过runtime方法来实现 */
    - (void)setAnimatedNumber:(NSNumber *)animatedNumber {
        objc_setAssociatedObject(self, "animatedNumber", animatedNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSNumber *)animatedNumber {
        return objc_getAssociatedObject(self, "animatedNumber");
    }
    
    - (void)setTimer:(NSTimer *)timer {
        objc_setAssociatedObject(self, "timer", timer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSTimer *)timer {
        return objc_getAssociatedObject(self, "timer");
    }
    
    
    - (void)setValueString:(NSString *)valueString {
        objc_setAssociatedObject(self, "valueString", valueString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSString *)valueString {
        return objc_getAssociatedObject(self, "valueString");
    }
    

    变量初始化以及定时器

    - (void)dw_setNumber:(NSNumber *)number {
        [self dw_setNumber:number duration:5.0];  //这里,我写5秒,是为了方便我录gif,使用中可以改为1或者2
    }
    

    显示金额动画

    - (void)changeAnimation:(NSTimer *)timer{
    
        NSMutableDictionary *info = timer.userInfo;
        int begin = (int)[info objectForKey:kBeginNumberKey];
        int end = ((NSNumber *)[info objectForKey:kEndNumberKey]).intValue;
        int range = ((NSNumber *)[info objectForKey:kRangeNumberKey]).intValue;
        
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterNoStyle];
        [formatter setFormatWidth:9];
        [formatter setPositiveFormat:@",##0.00"];
    
        int value = self.valueString.intValue;
        
        if (value == 0) {
            self.valueString = [NSString stringWithFormat:@"%d", begin];
            self.text = [NSString stringWithFormat:@"%.@",[formatter stringFromNumber:@(begin)]];
        } else if (value >= end) {
            self.text = [NSString stringWithFormat:@"%.@",[formatter stringFromNumber:@(end)]];
            [self.timer invalidate];
            self.timer = nil;
            return;
        } else {
            value += range;
            self.valueString = [NSString stringWithFormat:@"%d", value];
            self.text = [NSString stringWithFormat:@"%.@",[formatter stringFromNumber:@(value)]];
            
        }
        
    }
    



    代码传送门

    相关文章

      网友评论

      • Dwyane_Coding:https://github.com/iDwyane/advanced-iOS 源码已有更新,@路小白同学 疑惑之前的5怎么来,那是十六进制的内存地址转化成十进制而来。为了不产生误解,已改正。
      • 路小白同学:你好,看了您的代码,有一点不是很明白,int begin = (int)[info objectForKey:kBeginNumberKey];取出的NSNumber的值是0,请过强制类型转化变成了整形5。若果按照double begin = ((NSNumber *)[info objectForKey:kBeginNumberKey]).doubleValue;这样写,得出的是正确的0,不过会发生死循环,请问这是什么原因呢?
        路小白同学:@路小白同学 而且强转后0变成5了,很费解啊
        路小白同学:@Dwyane_Coding int begin = (int)[info objectForKey:kBeginNumberKey]; 为什么要强转?
        Dwyane_Coding:你好,首先感谢关注此文。可否更详细的贴出您产生问题的代码片段。

      本文标题:金额跳动动画效果

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