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.登录后的界面如图所示,如果没有最上面的两个选项 ...
随机推荐
- Openfire/XMPP学习之——一个简单的Smack样例
昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...
- golang 字符串操作实例
package main import s "strings" import "fmt" var p = fmt.Println func main() { p ...
- C语言 第六章 多重循环
一.概要 在c语言中,if,switch,for,while,do-while可以相互间多次嵌套. if(){ for() { for() { } } } while() { for(){ } for ...
- 【JAVA】基于MVC架构Java技术荟萃案例演练
基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...
- 原创:微信小程序源码解说:石头剪刀布(附源码下载)
我的博客:来源链接 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. JS: var numAi = 0 var timer ...
- C#二进制流的序列化和反序列化
public class BinaryHelper { /// <summary> /// 将对象序列化为byte[] /// 使用IFormatter的Serialize序列化 /// ...
- 网页开发中文本编辑器UEditor的使用
首先看一下效果图: 首先我们需要来认识下UEditor,它是由百度web前端研发部开发所见即所得富文本web编辑器,并且是基于BSD协议的开源产品,允许自由使用和修改,开源就意味着可以自己来定制这个编 ...
- C# 利用socekt做到http监听,怎么样才能做到高性能
c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...
- Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署
本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...
- dobbo zookeeper 认识
dubbo 主要使用来整合各种协议的服务,服务提供者可以向dubbo平台注册服务,服务消费都可以看到所有服务的详细信息,而已可以调用所提供的服务接口.zookeeper:主是要服务的集群,配置管理(如 ...