效果图

具体实现代码如下

ZCWScrollNumView.h文件

#import <UIKit/UIKit.h>

typedef enum {
ZCWScrollNumAnimationTypeNone,
ZCWScrollNumAnimationTypeNormal,
ZCWScrollNumAnimationTypeFromLast,
ZCWScrollNumAnimationTypeRand,
ZCWScrollNumAnimationTypeFast
} ZCWScrollNumAnimationType; @interface ZCWScrollDigitView : UIView {
CGFloat _oneDigitHeight;
} @property (retain, nonatomic) UIView *backgroundView;
@property (retain, nonatomic) UILabel *label;
@property (readonly, nonatomic) NSUInteger digit;
@property (retain, nonatomic) UIFont *digitFont; - (void)setDigitAndCommit:(NSUInteger)aDigit;
- (void)setDigitFromLast:(NSUInteger)aDigit;
- (void)setDigit:(NSUInteger)aDigit from:(NSUInteger)last;
- (void)setDigitFast:(NSUInteger)aDigit;
- (void)setRandomScrollDigit:(NSUInteger)aDigit length:(NSUInteger)length; - (void)commitChange; - (void)didConfigFinish; @end @interface ZCWScrollNumView : UIView {
NSMutableArray *_numberViews;
} @property (nonatomic) NSUInteger numberSize;
@property (nonatomic) CGFloat splitSpaceWidth;
@property (nonatomic) CGFloat topAndBottomPadding;
@property (readonly, nonatomic) NSUInteger numberValue;
@property (retain, nonatomic) UIView *backgroundView;
@property (retain, nonatomic) UIView *digitBackgroundView;
@property (retain, nonatomic) UIFont *digitFont;
@property (readonly, nonatomic) NSArray *numberViews;
@property (retain, nonatomic) UIColor *digitColor;
@property (nonatomic) NSUInteger randomLength;
- (void)setNumber:(NSUInteger)number withAnimationType:(ZCWScrollNumAnimationType)type animationTime:(NSTimeInterval)timeSpan; - (void)didConfigFinish;
@end

ZCWScrollNumView.m文件

#import "ZCWScrollNumView.h"

#define kRandomLength 10
#define kDefaultDigitFont [UIFont systemFontOfSize:14.0] @implementation ZCWScrollDigitView @synthesize backgroundView;
@synthesize label;
@synthesize digit;
@synthesize digitFont;
- (void)setDigitAndCommit:(NSUInteger)aDigit {
self.label.text = [NSString stringWithFormat:@"%zd", aDigit];
CGRect rect = self.label.frame;
rect.origin.y = ;
rect.size.height = _oneDigitHeight;
self.label.numberOfLines = ;
self.label.frame = rect;
digit = aDigit;
}
- (void)setDigit:(NSUInteger)aDigit from:(NSUInteger)last{
if (aDigit == last) {
[self setDigitAndCommit:aDigit];
return;
}
NSMutableString *str = [NSMutableString stringWithFormat:@"%zd", last];
int count = ;
if (aDigit > last) {
for (int i = (int)last + ; i < aDigit + ; ++i) {
++count;
[str appendFormat:@"\n%d", i];
}
} else {
for (int i = (int)last + ; i < ; ++i) {
++count;
[str appendFormat:@"\n%d", i];
}
for (int i = ; i < aDigit + ; ++i) {
++count;
[str appendFormat:@"\n%d", i];
}
}
self.label.text = str;
self.label.numberOfLines = count;
CGRect rect = self.label.frame;
rect.origin.y = ;
rect.size.height = _oneDigitHeight * count;
self.label.frame = rect;
digit = aDigit;
}
- (void)setDigitFromLast:(NSUInteger)aDigit {
[self setDigit:aDigit from:self.digit]; } - (void)setDigitFast:(NSUInteger)aDigit{
self.label.text = [NSString stringWithFormat:@"%zd\n%zd", self.digit, aDigit];
self.label.numberOfLines = ;
CGRect rect = self.label.frame;
rect.origin.y = ;
rect.size.height = _oneDigitHeight * ;
self.label.frame = rect;
digit = aDigit;
} - (void)setRandomScrollDigit:(NSUInteger)aDigit length:(NSUInteger)length{
NSMutableString *str = [NSMutableString stringWithFormat:@"%zd", self.digit];
for (int i = ; i < length - ; ++i) {
[str appendFormat:@"\n%d", rand() % ];
}
[str appendFormat:@"\n%zd", aDigit];
self.label.text = str;
self.label.numberOfLines = length;
CGRect rect = self.label.frame;
rect.origin.y = ;
rect.size.height = _oneDigitHeight * length;
self.label.frame = rect;
digit = aDigit; } - (void)commitChange{ CGRect rect = self.label.frame;
rect.origin.y = _oneDigitHeight - rect.size.height;
self.label.frame = rect;
} - (void)didConfigFinish{ if (self.backgroundView == nil) {
self.backgroundView = [[UIView alloc] init];
self.backgroundView.backgroundColor = [UIColor grayColor];
}
CGRect backrect = {{, }, self.frame.size};
self.backgroundView.frame = backrect;
[self addSubview:self.backgroundView]; CGSize size= [@"" sizeWithFont:self.digitFont]; _oneDigitHeight = size.height; CGRect rect = {{(self.frame.size.width - size.width) / , (self.frame.size.height - size.height) / }, size};
UIView *view = [[UIView alloc] initWithFrame:rect];
view.backgroundColor = [UIColor clearColor];
view.clipsToBounds = YES;
rect.origin.x = ;
rect.origin.y = ;
self.label = [[UILabel alloc] initWithFrame:rect];
self.label.font = self.digitFont;
self.label.backgroundColor = [UIColor clearColor];
[view addSubview:self.label];
[self addSubview:view];
[self setDigitAndCommit:self.digit]; } @end @implementation ZCWScrollNumView
@synthesize numberSize;
@synthesize numberValue;
@synthesize backgroundView;
@synthesize digitBackgroundView;
@synthesize digitFont;
@synthesize numberViews = _numberViews;
@synthesize splitSpaceWidth;
@synthesize topAndBottomPadding;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self initScrollNumView];
}
return self;
} - (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self initScrollNumView];
}
return self;
} - (void)initScrollNumView {
self.numberSize = ;
numberValue = ;
self.splitSpaceWidth = 2.0;
self.topAndBottomPadding = 2.0;
self.digitFont = kDefaultDigitFont;
self.randomLength = kRandomLength;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/ - (void)setNumber:(NSUInteger)number withAnimationType:(ZCWScrollNumAnimationType)type animationTime:(NSTimeInterval)timeSpan {
for (int i = ; i < numberSize; ++i) {
ZCWScrollDigitView *digitView = [_numberViews objectAtIndex:i];
NSUInteger digit = [ZCWScrollNumView digitFromNum:number withIndex:i];
if (digit != [self digitIndex:i] || type == ZCWScrollNumAnimationTypeRand)
switch (type) {
case ZCWScrollNumAnimationTypeNone:
[digitView setDigit:digit from:digit];
break; case ZCWScrollNumAnimationTypeNormal:
[digitView setDigit:digit from:];
break;
case ZCWScrollNumAnimationTypeFromLast:
[digitView setDigitFromLast:digit];
break; case ZCWScrollNumAnimationTypeRand:
[digitView setRandomScrollDigit:digit length:self.randomLength];
break;
case ZCWScrollNumAnimationTypeFast:
[digitView setDigitFast:digit];
default:
break;
}
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:timeSpan]; for (ZCWScrollDigitView *digitView in _numberViews) {
[digitView commitChange];
}
[UIView commitAnimations];
numberValue = number;
} + (NSUInteger)digitFromNum:(NSUInteger)number withIndex:(NSUInteger)index {
NSUInteger num = number;
for (int i = ; i < index; ++i) {
num /= ;
} return num % ;
} - (NSUInteger)digitIndex:(NSUInteger)index {
return [ZCWScrollNumView digitFromNum:self.numberValue withIndex:index]; } - (void)didConfigFinish {
CGRect backRect = {{, }, self.frame.size};
self.backgroundView.frame = backRect;
[self addSubview:self.backgroundView];
_numberViews = [[NSMutableArray alloc] initWithCapacity:self.numberSize];
CGFloat allWidth = self.frame.size.width;
CGFloat digitWidth = (allWidth - (self.numberSize + ) * splitSpaceWidth) / self.numberSize;
NSData *digitBackgroundViewData = [NSKeyedArchiver archivedDataWithRootObject:self.digitBackgroundView];
for (int i = ; i < numberSize; ++i) {
CGRect rect = {{allWidth - (digitWidth + self.splitSpaceWidth) * (i + ), self.topAndBottomPadding}, {digitWidth, self.frame.size.height - self.topAndBottomPadding * }}; ZCWScrollDigitView *digitView = [[ZCWScrollDigitView alloc] initWithFrame:rect];
digitView.backgroundView = [NSKeyedUnarchiver unarchiveObjectWithData:digitBackgroundViewData];
digitView.digitFont = self.digitFont;
[digitView didConfigFinish];
[digitView setDigitAndCommit:[self digitIndex:i]];
if (self.digitColor != nil) {
digitView.label.textColor = self.digitColor;
}
[_numberViews addObject:digitView];
[self addSubview:digitView];
}
}
@end

控制端代码

#import "TianJiCeSuanViewController.h"
#import "ZCWScrollNumView.h"
#import "HXSrollAnimalView.h" #define kAllFullSuperviewMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin; @interface TianJiCeSuanViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *BgView;
@property (weak, nonatomic) IBOutlet HXSrollAnimalView *shengxiaoView;
@property (weak, nonatomic) IBOutlet ZCWScrollNumView *weishuView; @end @implementation TianJiCeSuanViewController - (void)viewDidLoad {
[super viewDidLoad]; // 设置导航栏
[self setNav]; [self setscrollNumer];
[self setscrollAnimal]; [self.view insertSubview:self.BgView atIndex:];
} -(void)setscrollNumer{ CGRect tmp = self.weishuView.bounds;
self.weishuView.numberSize =
;
UIImage *image = [[UIImage imageNamed:@"bj_numbg"] stretchableImageWithLeftCapWidth: topCapHeight:];
self.weishuView.backgroundView = [[UIImageView alloc] initWithImage:image];
UIView *digitBackView = [[UIView alloc] initWithFrame:tmp];
digitBackView.backgroundColor = [UIColor clearColor];
digitBackView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
digitBackView.autoresizesSubviews = YES;
image = [[UIImage imageNamed:@"money_bg"] stretchableImageWithLeftCapWidth: topCapHeight:];
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:image];
bgImageView.frame = tmp;
bgImageView.autoresizingMask = kAllFullSuperviewMask;
[digitBackView addSubview:bgImageView];
image = [[UIImage imageNamed:@"money_bg_mask"] stretchableImageWithLeftCapWidth: topCapHeight:];
UIImageView *bgMaskImageView = [[UIImageView alloc] initWithImage:image];
bgMaskImageView.autoresizingMask = kAllFullSuperviewMask;
bgMaskImageView.frame = tmp;
[digitBackView addSubview:bgMaskImageView]; self.weishuView.digitBackgroundView = digitBackView;
self.weishuView.digitColor = [UIColor whiteColor];
self.weishuView.digitFont = [UIFont systemFontOfSize:17.0];
[self.weishuView didConfigFinish];
}
-(void)setscrollAnimal{ CGRect tmp = self.shengxiaoView.bounds;
self.shengxiaoView.numberSize =
;
UIImage *image = [[UIImage imageNamed:@"bj_numbg"] stretchableImageWithLeftCapWidth: topCapHeight:];
self.shengxiaoView.backgroundView = [[UIImageView alloc] initWithImage:image];
UIView *digitBackView = [[UIView alloc] initWithFrame:tmp];
digitBackView.backgroundColor = [UIColor clearColor];
digitBackView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
digitBackView.autoresizesSubviews = YES;
image = [[UIImage imageNamed:@"money_bg"] stretchableImageWithLeftCapWidth: topCapHeight:];
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:image];
bgImageView.frame = tmp;
bgImageView.autoresizingMask = kAllFullSuperviewMask;
[digitBackView addSubview:bgImageView];
image = [[UIImage imageNamed:@"money_bg_mask"] stretchableImageWithLeftCapWidth: topCapHeight:];
UIImageView *bgMaskImageView = [[UIImageView alloc] initWithImage:image];
bgMaskImageView.autoresizingMask = kAllFullSuperviewMask;
bgMaskImageView.frame = tmp;
[digitBackView addSubview:bgMaskImageView]; self.shengxiaoView.digitBackgroundView = digitBackView;
self.shengxiaoView.digitColor = [UIColor whiteColor];
self.shengxiaoView.digitFont = [UIFont systemFontOfSize:17.0];
[self.shengxiaoView didConfigFinish];
} -(void)setNav{
// 设置导航栏的标题
self.navigationItem.title = @"天机测算";
// 设置字体
[self.navigationController.navigationBar setTitleTextAttributes:
@{NSFontAttributeName:[UIFont systemFontOfSize:],
NSForegroundColorAttributeName:XMGRGBColor(, , )}];
self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithImage:@"ico_share" highImage:@"ico_share" target:self action:@selector(share)];
} -(void)share{ }
- (IBAction)qiuShengXiao { self.shengxiaoView.hidden = NO;
[self.shengxiaoView setNumber:rand() withAnimationType:HXSScrollNumAnimationTypeRand animationTime:]; }
- (IBAction)qiuWeiShu {
self.weishuView.hidden = NO;
[self.weishuView setNumber:rand() withAnimationType:ZCWScrollNumAnimationTypeRand animationTime:];
}
@end

iOS 数字滚动 类似于老 - 虎- 机的效果的更多相关文章

  1. 原生javascript实现老.虎机抽奖点名demo源码思路解析

    想着使用原生Javascript做一个随机点名的小应用, 也可以做抽奖使用. html简单化,人名单可以通过js生成并处理. 可以非常随意的添加修改人名字. 应用想带点特效,比如老.虎机转动的特效. ...

  2. IOS中(类似于进度条哪种效果)MBProgressHUD的使用

    1.显示HUD MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.labelText = ...

  3. Vue.js大屏数字滚动翻转效果

    ================================ 大屏数字滚动翻转效果来源于最近工作中element后台管理页面一张大屏的UI图,该UI图上有一个模块需要有数字往上翻动的效果,以下是最 ...

  4. 抽奖动画 - lao虎机抽奖

    本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...

  5. 让数字变化炫酷起来,数字滚动Text组件[Unity]

    让数字滚动起来 上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画.这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一 ...

  6. iOS Sprite Kit教程之真机测试以及场景的添加与展示

    iOS Sprite Kit教程之真机测试以及场景的添加与展示 IOS实现真机测试 在进行真机测试之前,首先需要确保设备已经连在了Mac(或者Mac虚拟机)上,在第1.9.1小节开始,设备就一直连接在 ...

  7. [issue] [iOS 10] 升级后无法真机测试 Could not find Developer Disk Image

    说明:更新了手机的到了iOS 10.0.2.真机调试时候提示"Could not find Developer Disk Image" 并且之前就下载了Xcode8,但是没有安装X ...

  8. 如何让老Mac机支持USB安装Windows

    一些老Mac机的用户想装Windows,却发现自己的系统上的Boot Camp Assistant(以下简称BCA)没有USB安装Windows的选项. 下面以我的MacBook Pro (13-in ...

  9. iOS 开发之 Xcode6 创建真机调试证书

    http://jingyan.baidu.com/article/ff411625b8141312e48237a7.html 1.登录苹果开发者中心 2.登录后的界面如图所示,如果没有最上面的两个选项 ...

随机推荐

  1. DOM-Text类型、Comment类型、CDATASection类型、DocumentType类型、DocumentFragment类型、Attr类型

    Text类型 文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容.Text节点具有以下特征: nodeType的值为3 nodeName的值为"text" nodeVa ...

  2. Oracle_SQL函数-单行函数

    SQL函数 SQL函数分类 SQL函数主要有两种,分为单行函数.多行函数 单行函数:只对一行进行变换,每行返回一个结果.可以转换数据类型,可以嵌套参数可以是一列或一个值 多行函数:多行函数,每次对一组 ...

  3. IOS开发之获取Storyboard创建的ViewController

    前面的两篇博客都是学习有关屏幕适配也就是相对布局的东西,这篇博客中将会学习视图间的切换.视图间的切换我们可以用代码完成或者用storyboard来建立各个视图控制器间的关系.在需要用到代码进行切换时会 ...

  4. RAC 10.2.0.5,客户端登陆间断遭遇ORA-12545

    实验环境: 服务端:OEL 5.7 + Oracle 10.2.0.5 RAC  客户端:Windows 7 + Oracle 11.2.0.1 Client   1.客户端登陆间断遭遇ORA-125 ...

  5. python mock基本使用

    什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...

  6. 关于Java中的transient关键字

    Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...

  7. T-SQL CROSS APPLY、MERGE

    写在前面 刚才看项目里一个存储过程,也是好长时间没有使用Sql Server2008了,好多写法和函数感觉到陌生,这就遇到了CROSS APPLY 和MERGE的语法,两者之前完全没接触过. 所以专门 ...

  8. OpenCV2简单的特征匹配

    特征的匹配大致可以分为3个步骤: 特征的提取 计算特征向量 特征匹配 对于3个步骤,在OpenCV2中都进行了封装.所有的特征提取方法都实现FeatureDetector接口,DescriptorEx ...

  9. gradle学习笔记

    一直想着花时间学习下gradle,今天有空.入门一下.参考:极客学院gradle使用指南,官方文档:gradle-2.12/docs/userguide/installation.html,以及百度阅 ...

  10. SQL Server里的闩锁耦合(Latch Coupling)

    几年前,我写了篇关于闩锁和为什么SQL Server需要它们的文章.在今天的文章里,我想进一步谈下非缓存区闩锁(Non-Buffer Latches),还有在索引查找操作期间,SQL Server如何 ...