iOS 数字滚动 类似于老 - 虎- 机的效果
效果图


具体实现代码如下
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 数字滚动 类似于老 - 虎- 机的效果的更多相关文章
- 原生javascript实现老.虎机抽奖点名demo源码思路解析
想着使用原生Javascript做一个随机点名的小应用, 也可以做抽奖使用. html简单化,人名单可以通过js生成并处理. 可以非常随意的添加修改人名字. 应用想带点特效,比如老.虎机转动的特效. ...
- IOS中(类似于进度条哪种效果)MBProgressHUD的使用
1.显示HUD MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.labelText = ...
- Vue.js大屏数字滚动翻转效果
================================ 大屏数字滚动翻转效果来源于最近工作中element后台管理页面一张大屏的UI图,该UI图上有一个模块需要有数字往上翻动的效果,以下是最 ...
- 抽奖动画 - lao虎机抽奖
本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...
- 让数字变化炫酷起来,数字滚动Text组件[Unity]
让数字滚动起来 上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画.这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一 ...
- iOS Sprite Kit教程之真机测试以及场景的添加与展示
iOS Sprite Kit教程之真机测试以及场景的添加与展示 IOS实现真机测试 在进行真机测试之前,首先需要确保设备已经连在了Mac(或者Mac虚拟机)上,在第1.9.1小节开始,设备就一直连接在 ...
- [issue] [iOS 10] 升级后无法真机测试 Could not find Developer Disk Image
说明:更新了手机的到了iOS 10.0.2.真机调试时候提示"Could not find Developer Disk Image" 并且之前就下载了Xcode8,但是没有安装X ...
- 如何让老Mac机支持USB安装Windows
一些老Mac机的用户想装Windows,却发现自己的系统上的Boot Camp Assistant(以下简称BCA)没有USB安装Windows的选项. 下面以我的MacBook Pro (13-in ...
- iOS 开发之 Xcode6 创建真机调试证书
http://jingyan.baidu.com/article/ff411625b8141312e48237a7.html 1.登录苹果开发者中心 2.登录后的界面如图所示,如果没有最上面的两个选项 ...
随机推荐
- Binary XML file line #2: Error inflating
06-27 14:29:27.600: E/AndroidRuntime(6936): FATAL EXCEPTION: main 06-27 14:29:27.600: E/AndroidRunti ...
- 数据可视化-EChart2.0.0使用中遇到的2个问题
之前项目中都是使用FusionChart和HighChart,基本都是没有购买商业许可.然后现在开发的系统需要交付给客户使用.所以现在图表控件不能直接使用FusionChart和HighChart,通 ...
- windows server 注意windows的temp目录
windows解压缩包.安装软件时,会生成一些临时文件存放在temp目录中,windows不会自动删除这些文件. 临时文件目录可以在环境变量中查看和配置 在工作机or个人PC机中中这个目录一般不会有什 ...
- EasyUI DataGrid 修改每页显示数量的最大值&&导出Grid到Excel
首先,最近在搞那个DataGrid的导出,发现,网上的用JS导出到本地的方法虽然可用,但是只能导出DataGrid当前的数据,例如说,DataGrid默认是最大显示50行,但是如果有多页,那么就无法显 ...
- PHP关于web页面交互内容
学php学了有一段时间了总结总结给大家分享一下 PHP中的引用 第一段程序: <?php $first_name="firstName"; $first=&$firs ...
- Hammer.js分析(三)——input.js
input.js是所有input文件夹中类的父类,浏览器事件绑定.初始化特定的input类.各种参数计算函数. Input父类和其子类就是在做绑定事件,各种参数计算.整合.设置等返回自定义事件对象,交 ...
- 软件工程 Android小游戏 猜拳大战
一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Andr ...
- Android 学习Activity(1)activity和intent
工具是:JDK环境配置+SDK+ADT工具 一.Activity 主要作用: 1.用户与应用程序的接口 2.控件的容器 二.创建Activity要点:(在src中的目录下包里) 1.一个Activi ...
- activity结束之后刷新之前的activity的内容
点击添加按钮之后-----弹出一个新的activity--------在新的activity将数据输入保存之后,关闭当前的activity回到之前的activity刷新内容 实现:使用onActivi ...
- sql server实现自定义分割月功能
本文目录列表: 1.为何出现自定义分割月需求 2.sql server实现自定义分割月功能 3.测试验证效果 4.总结语 5.参考清单列表 1.为何出现自定义分割月的需求 今天梳理一个平台的所 ...