美文网首页iOS动画iOS Developer
iOS - 给数字的改变增加动效

iOS - 给数字的改变增加动效

作者: 喵小泣 | 来源:发表于2017-03-22 14:00 被阅读122次

地址放在最前面:

简单实现动效改变数字-github

写在前面

最近在使用一些app时 , 发现他们点赞功能后面的数字增加或者减少会有一个动画改变的效果 , 很喜欢这样的小细节 , 于是自己动手做了一个类似demo ~~

效果图

结构

<small><small><small><small> 话说图好丑啊!!!!😝(看不到,看不到..)</small></small></small></small>

代码分析

  • 因为在创建scrollLayer时, 需要对新旧两个数值进行比较 , 所以setter方法中应该先设置scrollLayer , 然后再进行赋值.创建的scrollLayer会保存在数组中
//设置显示的数字
-(void)setNumberValue:(NSNumber *)numberValue {
    [self configScrollLayers:numberValue];
    _numberValue = numberValue;
}
  • 在configScrollLayer方法中,因为我们有时候要复用这些scrollLayer , 而数字位数的复用是从低位到高位.(比如第一次数字是12 , 第二次数字是123 , 那么我们能复用的是第一次的个位和十位对应的layer).所以我这里保存layer的数组 , 存放顺序是从右到左 . 即array[0]代表的是最低位的数字(最右边的数字). 计算layer位置也是从右到左计算 , 简化逻辑
CGFloat lastX = 0;
    //先根据对齐方式 , 计算最低位数字的x值
    if (_alignment == NSTextAlignmentRight) {
        lastX = self.frame.size.width - kAnimationNumberLabel_eachWidth - _contentEdgeInsets.right;
    } else if (_alignment == NSTextAlignmentLeft) {
        lastX = (kAnimationNumberLabel_eachWidth + _textMargin) * (numberValue.description.length - 1) + _contentEdgeInsets.left;
    } else if (_alignment == NSTextAlignmentCenter) {
        lastX = self.frame.size.width / 2.0 + (kAnimationNumberLabel_eachWidth * numberValue.description.length + _textMargin * (numberValue.description.length - 1)) / 2.0 - kAnimationNumberLabel_eachWidth;
    }
  • 复用layer的逻辑是先比较新旧两个数组的个数 , 如果新数组位数小于scrollLayers.count , 则需要将多余的layer从数组和页面中移除 , 保存到temLayers中 . 如果新数组位数大于scrollLayers.count , 则需要判断temLayers中是否有layer , 有的话拿来复用 , 没有的话创建新的layer
//如果之前数字的位数大于新数字的位数 , 将多余的layer移除存放如temLayers中 , 复用剩下的layer
    for (NSInteger i = numberValue.description.length; i<_scrollLayers.count; i++) {
        [_temLayers addObject:_scrollLayers[i]];
        [_scrollLayers[i] removeFromSuperlayer];
        [_scrollLayers removeObjectAtIndex:i];
        i--;
    }
    
    //如果之前的数字的位数小于新数字的位数 , 添加新的layer .
    for (NSInteger i = _scrollLayers.count; i<numberValue.description.length; i++) {
        CGRect frame = CGRectMake(lastX - i * kAnimationNumberLabel_eachWidth, 0, kAnimationNumberLabel_eachWidth, self.bounds.size.height);
        if (_temLayers.count) {
            _temLayers.lastObject.frame = frame;
            [_scrollLayers addObject:_temLayers.lastObject];
            [self.layer addSublayer:_temLayers.lastObject];
            [_temLayers removeObjectAtIndex:_temLayers.count - 1];
        } else {
            TextTransformationLayer *textLayer = [TextTransformationLayer layer];
            textLayer.frame = frame;
            
            [textLayer setTextArray:@[@".",@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"] font:_font textColor:_textColor selectText:nil];
            [_scrollLayers addObject:textLayer];
            [self.layer addSublayer:textLayer];
        }
        
    }
  • 最后对每个位数上的layer进行动画处理 , 滚动到正确的位置
//遍历layer 进行赋值和计算frame
    for (NSInteger i = 0; i<_scrollLayers.count; i++) {
        TextTransformationLayer *layer = _scrollLayers[i];
        layer.frame = CGRectMake(lastX - i * kAnimationNumberLabel_eachWidth - _textMargin * i, 0, kAnimationNumberLabel_eachWidth, self.bounds.size.height);
        
        //如果是0到9或者9到0 , 不进行动画展示
        BOOL animated;
        NSString *newStr = [numberValue.description substringWithRange:NSMakeRange(_scrollLayers.count - i - 1, 1)];

        if (i<_numberValue.description.length) {
            NSString *curStr = [_numberValue.description substringWithRange:NSMakeRange(_numberValue.description.length - i - 1, 1)];
            animated = (abs(newStr.intValue - curStr.intValue) < 9);
        } else {
            animated = NO;
        }
        
        animated = (animated && layer.selectText);
        [layer setSelectText:newStr animated:animated];;
    }

使用方法

使用的话就很简单了 , 先创建对象 , 然后进行赋值就好了

  NumberTransformationView *view = [[NumberTransformationView alloc] initWithFrame:frame font:[UIFont systemFontOfSize:18]];

  view.numberValue = @200;

总结

这个功能总体来说是比较简单的 , 我在动手coding之前大致思路是这样子的

  1. 首先要注意每个位数上的数字都应该有动画效果 , 所以不应该对整个数字做动画 , 而应该切分成若干个模块单独进行处理
  2. 切分后的模块应该注意复用 , 避免每次设值都要重新创建.
  3. 单独来看, 每个位数上的逻辑处理是一样的 , 所以应该单独拿出来作为一个功能.我这里对应的是TextTransformationLayer . 所有逻辑和动画效果都在由这个类完成 , NumberTransformationView只是对前者功能的一个组合.

写在最后

<big>**demo在最上 , 下载时欢迎顺手赏个star. (¬_¬)
以上.
**</big>

相关文章

  • iOS - 给数字的改变增加动效

    地址放在最前面: 简单实现动效改变数字-github 写在前面 最近在使用一些app时 , 发现他们点赞功能后面的...

  • [iOS] 视频添加动效水印实现介绍

    [iOS] 视频添加动效水印实现介绍 [iOS] 视频添加动效水印实现介绍

  • YoYoBall加载动画

    欢迎同样喜爱动效的你加入iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:64807025...

  • Fade数字切换动效

    欢迎同样喜爱动效的你加入iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:64807025...

  • 数字变化动效

    在开发过程中经常会遇到数字从0不断变动的动画效果,在接到这样的需求后,我第一时间想到了通过计时器的方式对数字进行不...

  • iOS动效

    1️⃣、对称线画板,自定义线条数和颜色绘制 2️⃣、通过旋转手机查看全图 粒子动画+陀螺仪 3️⃣、非正弦波浪线三...

  • css简单动效

    简单的css3动效 直接上代码 摆钟 景色动效 相册 模拟ios手机相册吸附效果

  • 为功能而动效的APP UI设计

    APP中的动效可以划分为两类,一类是转场动效,应用在页面的切换,加载等,这类动效可以柔和页面的过度效果,增加切换、...

  • 腾讯课堂高级视觉设计师分享-动效设计进阶笔记

    一、产品动效存在的价值 01. 我们为什么要做动效设计 1.增加体验舒适度:让用户认知过程更自然。2.增加界面活力...

  • iOS动画详解(学习动画看这一篇就够了)

    动效设计一直是iOS平台的优势,良好的动效设计可以很好地提升用户体验。而动画则是动效的基础支撑。本动画将从易到难逐...

网友评论

  • priate:你对HUD感冒吗?progressHUD
    喵小泣:@priate 额 , 你要定制的这个HUD相对于MB会有什么优势吗
    priate:@喵小泣 :yum:我想模仿MB写自己的HUD,一起吗?自己定制的HUD
    喵小泣:@priate 额,有自定义过,不过通常情况用MB就够了:smile:
  • priate:赏🌟 (¬_¬)
    喵小泣:@priate 谢谢~

本文标题:iOS - 给数字的改变增加动效

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