效果图
具体实现代码如下
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 = 0;rect.size.height = _oneDigitHeight;self.label.numberOfLines = 1;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 = 1;if (aDigit > last) {for (int i = (int)last + 1; i < aDigit + 1; ++i) {++count;[str appendFormat:@"\n%d", i];}} else {for (int i = (int)last + 1; i < 10; ++i) {++count;[str appendFormat:@"\n%d", i];}for (int i = 0; i < aDigit + 1; ++i) {++count;[str appendFormat:@"\n%d", i];}}self.label.text = str;self.label.numberOfLines = count;CGRect rect = self.label.frame;rect.origin.y = 0;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 = 2;CGRect rect = self.label.frame;rect.origin.y = 0;rect.size.height = _oneDigitHeight * 2;self.label.frame = rect;digit = aDigit; }- (void)setRandomScrollDigit:(NSUInteger)aDigit length:(NSUInteger)length{NSMutableString *str = [NSMutableString stringWithFormat:@"%zd", self.digit];for (int i = 1; i < length - 1; ++i) {[str appendFormat:@"\n%d", rand() % 10];}[str appendFormat:@"\n%zd", aDigit];self.label.text = str;self.label.numberOfLines = length;CGRect rect = self.label.frame;rect.origin.y = 0;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 = {{0, 0}, self.frame.size};self.backgroundView.frame = backrect;[self addSubview:self.backgroundView];CGSize size= [@"8" sizeWithFont:self.digitFont];_oneDigitHeight = size.height;CGRect rect = {{(self.frame.size.width - size.width) / 2, (self.frame.size.height - size.height) / 2}, size};UIView *view = [[UIView alloc] initWithFrame:rect];view.backgroundColor = [UIColor clearColor];view.clipsToBounds = YES;rect.origin.x = 0;rect.origin.y = 0;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 = 1;numberValue = 0;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 = 0; 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:0];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 = 0; i < index; ++i) {num /= 10;}return num % 10; }- (NSUInteger)digitIndex:(NSUInteger)index {return [ZCWScrollNumView digitFromNum:self.numberValue withIndex:index];}- (void)didConfigFinish {CGRect backRect = {{0, 0}, 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 + 1) * splitSpaceWidth) / self.numberSize;NSData *digitBackgroundViewData = [NSKeyedArchiver archivedDataWithRootObject:self.digitBackgroundView];for (int i = 0; i < numberSize; ++i) {CGRect rect = {{allWidth - (digitWidth + self.splitSpaceWidth) * (i + 1), self.topAndBottomPadding}, {digitWidth, self.frame.size.height - self.topAndBottomPadding * 2}};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:0]; }-(void)setscrollNumer{CGRect tmp = self.weishuView.bounds;self.weishuView.numberSize = 3;UIImage *image = [[UIImage imageNamed:@"bj_numbg"] stretchableImageWithLeftCapWidth:10 topCapHeight:14];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:12 topCapHeight:12];UIImageView *bgImageView = [[UIImageView alloc] initWithImage:image];bgImageView.frame = tmp;bgImageView.autoresizingMask = kAllFullSuperviewMask;[digitBackView addSubview:bgImageView];image = [[UIImage imageNamed:@"money_bg_mask"] stretchableImageWithLeftCapWidth:12 topCapHeight:12];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 = 3;UIImage *image = [[UIImage imageNamed:@"bj_numbg"] stretchableImageWithLeftCapWidth:10 topCapHeight:14];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:12 topCapHeight:12];UIImageView *bgImageView = [[UIImageView alloc] initWithImage:image];bgImageView.frame = tmp;bgImageView.autoresizingMask = kAllFullSuperviewMask;[digitBackView addSubview:bgImageView];image = [[UIImage imageNamed:@"money_bg_mask"] stretchableImageWithLeftCapWidth:12 topCapHeight:12];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:19],NSForegroundColorAttributeName:XMGRGBColor(216, 184, 123)}];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:3];} - (IBAction)qiuWeiShu {self.weishuView.hidden = NO;[self.weishuView setNumber:rand() withAnimationType:ZCWScrollNumAnimationTypeRand animationTime:3]; } @end