zoukankan      html  css  js  c++  java
  • [翻译] JTNumberScrollAnimatedView

    JTNumberScrollAnimatedView

     本人视频教程系类   iOS中CALayer的使用

    效果:

    Use JTNumberScrollAnimatedView for have a nice animation for display number. It's easy to use, easy to customize.

    使用 JTNumberScrollAnimatedView来展示一个效果非常不错的显示数字变化的动画效果的控件,使用很简单,非常容易定制。

    Usage

    Basic usage - 基本的使用

    You can use JTNumberScrollAnimatedView like a normal view.

    你可以像使用一个普通的view一样来使用JTNumberScrollAnimatedView

    #import <UIKit/UIKit.h>
    
    #import "JTNumberScrollAnimatedView.h"
    
    @interface ViewController : UIViewController
    
    @property (weak, nonatomic) IBOutlet JTNumberScrollAnimatedView *animatedView;
    
    @end

    You just have to call setValue with a NSNumber and use startAnimation for launch the animation.

    你只需要调用setValue方法然后执行startAnimation方法就能显示效果。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [self.animatedView setValue:@249];
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        [self.animatedView startAnimation];
    }

    WARNING - 注意

    For now the value must be a positive integer.

    现在,这个值必须是正的不能是负数。

     

    Customization - 定制

    You can easily change some properties of the animation. Each caracter have its own column.

    你可以很简单的修改以下的一些属性

    • textColor
    • font
    • duration
    • durationOffset, delay between the end of the animation of each column
    • density, number of characters by column for the animation
    • minLength, you can force the minimum count of columns
    • isAscending, the direction of the scroll

    If you change one of this properties, you have to call setValue for update the view.

    如果你修改了其中的一个属性,你需要调用 setValue 来更新画面。

    Requirements

    • iOS 7 or higher                                 iOS7 或者更高版本
    • Automatic Reference Counting (ARC)  ARC
    //
    //  JTNumberScrollAnimatedView.h
    //  JTNumberScrollAnimatedView
    //
    //  Created by Jonathan Tribouharet
    //
    
    #import <UIKit/UIKit.h>
    
    @interface JTNumberScrollAnimatedView : UIView
    
    @property (strong, nonatomic) NSNumber *value;
    
    @property (strong, nonatomic) UIColor *textColor;
    @property (strong, nonatomic) UIFont *font;
    @property (assign, nonatomic) CFTimeInterval duration;
    @property (assign, nonatomic) CFTimeInterval durationOffset;
    @property (assign, nonatomic) NSUInteger density;
    @property (assign, nonatomic) NSUInteger minLength;
    @property (assign, nonatomic) BOOL isAscending;
    
    - (void)startAnimation;
    - (void)stopAnimation;
    
    @end
    //
    //  JTNumberScrollAnimatedView.m
    //  JTNumberScrollAnimatedView
    //
    //  Created by Jonathan Tribouharet
    //
    
    #import "JTNumberScrollAnimatedView.h"
    
    @interface JTNumberScrollAnimatedView(){
        NSMutableArray *numbersText;
        NSMutableArray *scrollLayers;
        NSMutableArray *scrollLabels;
    }
    
    @end
    
    @implementation JTNumberScrollAnimatedView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if(!self){
            return nil;
        }
        
        [self commonInit];
        
        return self;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super initWithCoder:aDecoder];
        if(!self){
            return nil;
        }
        
        [self commonInit];
        
        return self;
    }
    
    - (void)commonInit
    {
        self.duration = 1.5;
        self.durationOffset = .2;
        self.density = 5;
        self.minLength = 0;
        self.isAscending = NO;
        
        self.font = [UIFont systemFontOfSize:[UIFont systemFontSize]];
        self.textColor = [UIColor blackColor];
        
        numbersText = [NSMutableArray new];
        scrollLayers = [NSMutableArray new];
        scrollLabels = [NSMutableArray new];
    }
    
    - (void)setValue:(NSNumber *)value
    {
        self->_value = value;
        
        [self prepareAnimations];
    }
    
    - (void)startAnimation
    {
        [self prepareAnimations];
        [self createAnimations];
    }
    
    - (void)stopAnimation
    {
        for(CALayer *layer in scrollLayers){
            [layer removeAnimationForKey:@"JTNumberScrollAnimatedView"];
        }
    }
    
    - (void)prepareAnimations
    {
        for(CALayer *layer in scrollLayers){
            [layer removeFromSuperlayer];
        }
        
        [numbersText removeAllObjects];
        [scrollLayers removeAllObjects];
        [scrollLabels removeAllObjects];
        
        [self createNumbersText];
        [self createScrollLayers];
    }
    
    - (void)createNumbersText
    {
        NSString *textValue = [self.value stringValue];
        
        for(NSInteger i = 0; i < (NSInteger)self.minLength - (NSInteger)[textValue length]; ++i){
            [numbersText addObject:@"0"];
        }
        
        for(NSUInteger i = 0; i < [textValue length]; ++i){
            [numbersText addObject:[textValue substringWithRange:NSMakeRange(i, 1)]];
        }
    }
    
    - (void)createScrollLayers
    {
        CGFloat width = roundf(CGRectGetWidth(self.frame) / numbersText.count);
        CGFloat height = CGRectGetHeight(self.frame);
        
        for(NSUInteger i = 0; i < numbersText.count; ++i){
            CAScrollLayer *layer = [CAScrollLayer layer];
            layer.frame = CGRectMake(roundf(i * width), 0, width, height);
            [scrollLayers addObject:layer];
            [self.layer addSublayer:layer];
        }
        
        for(NSUInteger i = 0; i < numbersText.count; ++i){
            CAScrollLayer *layer = scrollLayers[i];
            NSString *numberText = numbersText[i];
            [self createContentForLayer:layer withNumberText:numberText];
        }
    }
    
    - (void)createContentForLayer:(CAScrollLayer *)scrollLayer withNumberText:(NSString *)numberText
    {
        NSInteger number = [numberText integerValue];
        NSMutableArray *textForScroll = [NSMutableArray new];
        
        for(NSUInteger i = 0; i < self.density + 1; ++i){
            [textForScroll addObject:[NSString stringWithFormat:@"%ld", (number + i) % 10]];
        }
        
        [textForScroll addObject:numberText];
    
        if(!self.isAscending){
            textForScroll = [[[textForScroll reverseObjectEnumerator] allObjects] mutableCopy];
        }
        
        CGFloat height = 0;
        for(NSString *text in textForScroll){
            UILabel * textLabel = [self createLabel:text];
            textLabel.frame = CGRectMake(0, height, CGRectGetWidth(scrollLayer.frame), CGRectGetHeight(scrollLayer.frame));
            [scrollLayer addSublayer:textLabel.layer];
            [scrollLabels addObject:textLabel];
            height = CGRectGetMaxY(textLabel.frame);
        }
    }
    
    - (UILabel *)createLabel:(NSString *)text
    {
        UILabel *view = [UILabel new];
        
        view.textColor = self.textColor;
        view.font = self.font;
        view.textAlignment = NSTextAlignmentCenter;
        
        view.text = text;
        
        return view;
    }
    
    - (void)createAnimations
    {
        CFTimeInterval duration = self.duration - ([numbersText count] * self.durationOffset);
        CFTimeInterval offset = 0;
        
        for(CALayer *scrollLayer in scrollLayers){
            CGFloat maxY = [[scrollLayer.sublayers lastObject] frame].origin.y;
            
            CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.y"];
            animation.duration = duration + offset;
            animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
            
            if(self.isAscending){
                animation.fromValue = [NSNumber numberWithFloat:-maxY];
                animation.toValue = @0;
            }
            else{
                animation.fromValue = @0;
                animation.toValue = [NSNumber numberWithFloat:-maxY];
            }
            
            [scrollLayer addAnimation:animation forKey:@"JTNumberScrollAnimatedView"];
            
            offset += self.durationOffset;
        }
    }
    
    @end
  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4176256.html
Copyright © 2011-2022 走看看