zoukankan      html  css  js  c++  java
  • 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 = 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:@"
    %d", i];
            }
        } else {
            for (int i = (int)last + 1; i < 10; ++i) {
                ++count;
                [str appendFormat:@"
    %d", i];
            }
            for (int i = 0; i < aDigit + 1; ++i) {
                ++count;
                [str appendFormat:@"
    %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
    %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:@"
    %d", rand() % 10];
        }
        [str appendFormat:@"
    %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
  • 相关阅读:
    面试题4:二维数组中查找
    面试题3:数组中重复的数字
    编程31:分别用递归和非递归的方式遍历二叉树
    编程17:判断一个列表是否是回文结构
    编程16:环形单链表的约瑟夫问题
    Sqli-labs less 55
    Sqli-labs less 56
    Sqli-labs less 57
    Sqli-labs less 58
    Sqli-labs less 59
  • 原文地址:https://www.cnblogs.com/qianLL/p/5596472.html
Copyright © 2011-2022 走看看