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

时间:2024-04-23 15:34:06

效果图

iOS  数字滚动 类似于老 - 虎-  机的效果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