写在前面
第一次写博客,有点小激动,同时也害怕写的很烂,所以希望大家能够包容,如果大家觉得看不下去我的博客,可以直接翻到最后有源码和demo的github地址。开发ios也有大半年了,所以想要尝试一下写点博客,好了废话不多说了下面开始正题了。
正文
简介
由于公司前段时间项目里要用到一个可以滚动的数字标签,所以就写了这样一个控件,现在有时间了,就写篇博客记录一下实现这个控件的过程。
上一张gif动画

这个控件的逻辑是当个位数从0~9~0时十位数向上滚动1,当十位完成一个0~9~0循环时,百位向上滚动1依次类推
实现思路
先说一下我实现这个控件的思路,其实比较简单,数字的每一列都是一个很长的UILabel,然后由上至下是数字0~9,当数字改变时,让这个label上下移动,产生滚动的动画,只需要计算循环的次数,滚动的方向,滚动的时间就可以了。
Talk is cheap,show you The code!
首先看一下头文件里的内容:
|
|
可以看到头文件里有7个初始化方法,分为两大类:规定列数和不规定列数。当规定列数时,则控件的列数固定,当传入的数字大于列数限制时函数直接返回,当不规定列数时,以初始化传入的数字的列数为初始列数,当后面传入的数字大于初始列数时,会自动在左边补加列(最大列数不能超过8列)
其中最重要的一个参数是字体的大小,我需要这个参数去计算此控件的大小。
另外两个方法当需要显示的数字改变时调用,animated传入YES时会有动画,传入NO时直接改变不播放动画。
下面只贴上其中一个init方法:
|
|
初始化后进入commonInit方法:
|
|
然后先初始化cell,再初始化parent:
|
|
然后是实现parent:
|
|
|
|
至此,初始化的工作全部完成
下面让我们关注头文件里另外的两个公有方法:
|
|
下面就要进入动画部分了
|
|
动画分为single和multi两种,multi动画里包括3个部分start,cycle,end;start部分是当前数值~9的动画,cycle部分是0~9的数次循环,end部分为0~最终数值(此处以数字增加举例,数字减少时相反)
下面贴出single和multi两种动画的代码:
|
|
核心动画部分代码都已经贴出来了,下面看下一些privite方法
首先是每个动画结束的checkTaskArrayWithAnimationCount:方法
|
|
计算列数的方法:calculateRowNumber:
这个方法很简单,就不做解释了
|
|
使指定cell显示相应数值的方法:setScrollCell: toNumber:
|
|
计算repeatCount的方法:getRepeatTimesWithChangeNumber: displayNumber:
这个方法我想用几个小例子来解释,等看完这个例子,再去看代码就不会觉得那么难懂了:比如当前展示数为521,要让它改变到530,注意个位数要循环多少次呢,其实它只有开始部分和结束部分,并没有循环部分,我代码的操作是将个位置0,520和530,530-520=10,10/10^1=1所以得到的循环次数是1,而我前面说过这个1不是真正的循环次数,而是循环次数加上end部分的1,所以当repeatCount=1时,只会有开始动画和结束动画。再举一个例子:521和542,先置0,520和540,520-540=20,20/10^1=2,repeatCount=2,而真正循环次数为1,我们看,当521经过开始动画变位530,随后经过一个循环变为540,再经过结束动画到达542,那么真正循环确实是1次,说明这种算法没有问题。当然这只举了个位为例,其它位以此类推都是相同的。
将一个数字准换为各位上应当展示的数值的方法:getCellDisplayNumberWithNumber:
举个例子就是这个数字是:521,则返回一个数组:[@1,@2,@5]
获得指定cell展示的数值的方法:getDisplayNumberOfCell:
|
|
计算动画总时间的方法:getIntervalWithOriginalNumber: displayNumber:
这个时间是根据最高位改变的位数来计算的,位数越高,每改变一次时间就越长。
代码部分到此结束
github地址:https://github.com/948080952/DPScrollNumberLabel
如果觉得我的代码对你有用处,请在github上给我一个赞,谢谢!