[翻译] JTNumberScrollAnimatedView
JTNumberScrollAnimatedView
本人视频教程系类 iOS中CALayer的使用
效果:
Use JTNumberScrollAnimatedView for have a nice animation for display number. It's easy to use, easy to customize.
使用 JTNumberScrollAnimatedView来展示一个效果非常不错的显示数字变化的动画效果的控件,使用很简单,非常容易定制。
Usage
Basic usage - 基本的使用
You can use JTNumberScrollAnimatedView
like a normal view.
你可以像使用一个普通的view一样来使用JTNumberScrollAnimatedView
- #import <UIKit/UIKit.h>
- #import "JTNumberScrollAnimatedView.h"
- @interface ViewController : UIViewController
- @property (weak, nonatomic) IBOutlet JTNumberScrollAnimatedView *animatedView;
- @end
You just have to call setValue
with a NSNumber and use startAnimation
for launch the animation.
你只需要调用setValue方法然后执行startAnimation方法就能显示效果。
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- [self.animatedView setValue:@249];
- }
- - (void)viewDidAppear:(BOOL)animated
- {
- [super viewDidAppear:animated];
- [self.animatedView startAnimation];
- }
WARNING - 注意
For now the value
must be a positive integer.
现在,这个值必须是正的不能是负数。
Customization - 定制
You can easily change some properties of the animation. Each caracter have its own column
.
你可以很简单的修改以下的一些属性
textColor
font
duration
durationOffset
, delay between the end of the animation of each columndensity
, number of characters by column for the animationminLength
, you can force the minimum count of columnsisAscending
, the direction of the scroll
If you change one of this properties, you have to call setValue
for update the view.
如果你修改了其中的一个属性,你需要调用 setValue 来更新画面。
Requirements
- iOS 7 or higher iOS7 或者更高版本
- Automatic Reference Counting (ARC) ARC
- //
- // JTNumberScrollAnimatedView.h
- // JTNumberScrollAnimatedView
- //
- // Created by Jonathan Tribouharet
- //
- #import <UIKit/UIKit.h>
- @interface JTNumberScrollAnimatedView : UIView
- @property (strong, nonatomic) NSNumber *value;
- @property (strong, nonatomic) UIColor *textColor;
- @property (strong, nonatomic) UIFont *font;
- @property (assign, nonatomic) CFTimeInterval duration;
- @property (assign, nonatomic) CFTimeInterval durationOffset;
- @property (assign, nonatomic) NSUInteger density;
- @property (assign, nonatomic) NSUInteger minLength;
- @property (assign, nonatomic) BOOL isAscending;
- - (void)startAnimation;
- - (void)stopAnimation;
- @end
- //
- // JTNumberScrollAnimatedView.m
- // JTNumberScrollAnimatedView
- //
- // Created by Jonathan Tribouharet
- //
- #import "JTNumberScrollAnimatedView.h"
- @interface JTNumberScrollAnimatedView(){
- NSMutableArray *numbersText;
- NSMutableArray *scrollLayers;
- NSMutableArray *scrollLabels;
- }
- @end
- @implementation JTNumberScrollAnimatedView
- - (instancetype)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if(!self){
- return nil;
- }
- [self commonInit];
- return self;
- }
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- self = [super initWithCoder:aDecoder];
- if(!self){
- return nil;
- }
- [self commonInit];
- return self;
- }
- - (void)commonInit
- {
- self.duration = 1.5;
- self.durationOffset = .;
- self.density = ;
- self.minLength = ;
- self.isAscending = NO;
- self.font = [UIFont systemFontOfSize:[UIFont systemFontSize]];
- self.textColor = [UIColor blackColor];
- numbersText = [NSMutableArray new];
- scrollLayers = [NSMutableArray new];
- scrollLabels = [NSMutableArray new];
- }
- - (void)setValue:(NSNumber *)value
- {
- self->_value = value;
- [self prepareAnimations];
- }
- - (void)startAnimation
- {
- [self prepareAnimations];
- [self createAnimations];
- }
- - (void)stopAnimation
- {
- for(CALayer *layer in scrollLayers){
- [layer removeAnimationForKey:@"JTNumberScrollAnimatedView"];
- }
- }
- - (void)prepareAnimations
- {
- for(CALayer *layer in scrollLayers){
- [layer removeFromSuperlayer];
- }
- [numbersText removeAllObjects];
- [scrollLayers removeAllObjects];
- [scrollLabels removeAllObjects];
- [self createNumbersText];
- [self createScrollLayers];
- }
- - (void)createNumbersText
- {
- NSString *textValue = [self.value stringValue];
- for(NSInteger i = ; i < (NSInteger)self.minLength - (NSInteger)[textValue length]; ++i){
- [numbersText addObject:@""];
- }
- for(NSUInteger i = ; i < [textValue length]; ++i){
- [numbersText addObject:[textValue substringWithRange:NSMakeRange(i, )]];
- }
- }
- - (void)createScrollLayers
- {
- CGFloat width = roundf(CGRectGetWidth(self.frame) / numbersText.count);
- CGFloat height = CGRectGetHeight(self.frame);
- for(NSUInteger i = ; i < numbersText.count; ++i){
- CAScrollLayer *layer = [CAScrollLayer layer];
- layer.frame = CGRectMake(roundf(i * width), , width, height);
- [scrollLayers addObject:layer];
- [self.layer addSublayer:layer];
- }
- for(NSUInteger i = ; i < numbersText.count; ++i){
- CAScrollLayer *layer = scrollLayers[i];
- NSString *numberText = numbersText[i];
- [self createContentForLayer:layer withNumberText:numberText];
- }
- }
- - (void)createContentForLayer:(CAScrollLayer *)scrollLayer withNumberText:(NSString *)numberText
- {
- NSInteger number = [numberText integerValue];
- NSMutableArray *textForScroll = [NSMutableArray new];
- for(NSUInteger i = ; i < self.density + ; ++i){
- [textForScroll addObject:[NSString stringWithFormat:@"%ld", (number + i) % ]];
- }
- [textForScroll addObject:numberText];
- if(!self.isAscending){
- textForScroll = [[[textForScroll reverseObjectEnumerator] allObjects] mutableCopy];
- }
- CGFloat height = ;
- for(NSString *text in textForScroll){
- UILabel * textLabel = [self createLabel:text];
- textLabel.frame = CGRectMake(, height, CGRectGetWidth(scrollLayer.frame), CGRectGetHeight(scrollLayer.frame));
- [scrollLayer addSublayer:textLabel.layer];
- [scrollLabels addObject:textLabel];
- height = CGRectGetMaxY(textLabel.frame);
- }
- }
- - (UILabel *)createLabel:(NSString *)text
- {
- UILabel *view = [UILabel new];
- view.textColor = self.textColor;
- view.font = self.font;
- view.textAlignment = NSTextAlignmentCenter;
- view.text = text;
- return view;
- }
- - (void)createAnimations
- {
- CFTimeInterval duration = self.duration - ([numbersText count] * self.durationOffset);
- CFTimeInterval offset = ;
- for(CALayer *scrollLayer in scrollLayers){
- CGFloat maxY = [[scrollLayer.sublayers lastObject] frame].origin.y;
- CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.y"];
- animation.duration = duration + offset;
- animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- if(self.isAscending){
- animation.fromValue = [NSNumber numberWithFloat:-maxY];
- animation.toValue = @;
- }
- else{
- animation.fromValue = @;
- animation.toValue = [NSNumber numberWithFloat:-maxY];
- }
- [scrollLayer addAnimation:animation forKey:@"JTNumberScrollAnimatedView"];
- offset += self.durationOffset;
- }
- }
- @end
[翻译] JTNumberScrollAnimatedView的更多相关文章
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- [翻译]开发文档:android Bitmap的高效使用
内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
随机推荐
- 如何查看yum安装路径
#yum install hdf5 #rpm -qa|grep hdf5 hdf5-1.8.7-1.el6.rf.x86_64 #rpm -ql hdf5-1.8.7-1.el6.rf.x86_64
- 使用单体模式设计原生js插件
----------基于上次写的jquery插件进行改造 http://www.cnblogs.com/GerryOfZhong/p/5533773.html 背景:jQuery插件依赖jQuery ...
- C#(winform)设置窗体的启动位置
只需要设置窗体的StartPosition属性: registerForm.StartPosition = FormStartPosition.CenterScreen; FormStartPosit ...
- uvm_config_db在UVM验证环境中的应用
如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战.一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处:另一些验证团队却过多的使用它,这让验证环 ...
- 基于node安装gulp-一些命令
1.win+r:进入cdm 2.node -v:查询是否安装node 3.npm install -g gulp:安装gulp 4.gulp -v:查看是否安装gulp 5.cd desk:进入桌面 ...
- git常用小操作。-- 自用
编辑 .gitignore bin-debug/ 忽略所有的叫bin-debug文件夹和他下面的文件 编辑 .git/config [core] repositoryformatversion = ...
- 给Solr配置中文分词器
第一步下载分词器https://pan.baidu.com/s/1X8v65YZ4gIkNQXsXfSULBw 第二歩打开已经解压的ik分词器文件夹 将ik-analyzer-solr5-5.x.ja ...
- C# 学习笔记(一) Winform利用Assembly反射动态创建窗体
1. 添加Reflection //添加对Reflection程序集引用 using System.Reflection; // 引用窗体创建方法CreateForm,传入参数 private voi ...
- Shiro官方快速入门10min例子源码解析框架1-初始化
Shiro,一个易用的Java安全框架,主要集合身份认证.授权.加密和session管理的功能. 这系文章主要简介Shiro架构,并通过官方的quickstart例程分析最简实现下Shiro的工作流程 ...
- Cookie介绍
1.Http协议与Cookie Cookie(小量信息)是HTTP协议指定的!先由服务器保存Cookie到浏览器,而下次浏览器请求服务器时把上一次请求得到Cookie再归还给服务器 由服务器创建保存到 ...