[翻译] 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 ...
随机推荐
- JS写游戏
最近在看萧井陌的视频.感觉一些东西挺有意思的,尤其是解决问题的过程,以及一个好程序应该改进的地方. 萧大的GITHUB:github.com/guaxiao/gua.game.js 视频:https: ...
- rpm: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory解决办法
不多说,直接上干货! 问题详情 [root@bigdatamaster app]# rpm -qa | grep gcc rpm: error : cannot open shared object ...
- python跳出多重循环
# -*- coding=utf-8 -*- """ 如何结束多重循环,在单层循环中,可以用break跳出循环,那两层,三层呢? """ # ...
- RabbitMQ的安装和配置化可视界面
RabbitMQ在windows下的安装 RabbitMQ 它依赖于Erlang,在window上安装时,需要先安装Erlang. 首先确定你的window电脑是32位还是64位,然后下载对应版本的E ...
- leetcode5:subsets问题
问题描述: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subse ...
- 11 java 线程池 使用实例
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- mysql时间统计,查询月份,周数据
在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_time 统计当天 sql语句为: select * from user where date(log_tim ...
- H5微信自定义分享链接(设置标题+简介+图片)
起源:最近公司在做招募广告的html5页面,然后做出来后,产品提出一个问题,需要分享出去的链接是卡片形式,内容也要自己定义,这下就难到我了,因为是第一次遇到这种需求,果断百度,然而,我就像大家一样,看 ...
- mybatis问题: There is no getter for property named 'equipmentId' in 'class java.lang.String'
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- 关于springmvc中常用的注解,自己也整理一下
1.@Controller 在springMVC中@controller主要用在控制层的类上,之前只知道用注解开发的时候必须加一个@controller ,今天看了别的大佬整理的才知道为什么这么用,控 ...