效果图

具体实现代码如下

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. # Hawk:开源贡献计划,设计,反思

    Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心.软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力. ...

  2. EntityFramework 7 Left Join Where Select 奇怪问题

    这篇博文纪录一下:使用 EF7,当 Linq 查询中使用 "Left Join" 语法(DefaultIfEmpty),Where Select 不同条件语法实现,出现的不同问题. ...

  3. ZOJ Problem Set - 1216 Deck

    #include <stdio.h> int main() { ]; double t=2.0; table[]=0.5; ;i<;i++) { t+=; table[i]=tabl ...

  4. struts2学习笔记--struts.xml配置文件详解

    这一节主要讲解struts2里面的struts.xml的常用标签及作用: 解决乱码问题 <constant name="struts.i18n.encoding" value ...

  5. 【LeetCode】Palindrome Pairs(336)

    1. Description Given a list of unique words. Find all pairs of distinct indices (i, j) in the given ...

  6. SQLServer学习笔记系列11

    一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...

  7. 一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版

    上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文 ...

  8. 【Android】Fragment懒加载和ViewPager的坑

    效果 老规矩,先来看看效果 ANDROID和福利两个Fragment是设置的Fragment可见时加载数据,也就是懒加载.圆形的旋转加载图标只有一个,所以,如果当前Fragment正处于加载状态,在离 ...

  9. Rafy 领域实体框架 - 树型实体功能(自关联表)

      在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...

  10. Autofac - 装配

    从容器中的可用服务中, 选取一个构造函数来创造对象, 这个过程就是自动装配. 一.选择构造函数 默认情况下, autofac会使用无参构造函数, 去创建对象. 我将Person类稍微修改了下. pub ...