zoukankan      html  css  js  c++  java
  • POPSpring动画参数详解

    POPSpring动画参数详解

    效果

    源码

    https://github.com/YouXianMing/Animations

    //
    //  POPSpringParameterController.m
    //  Animations
    //
    //  Created by YouXianMing on 15/11/29.
    //  Copyright © 2015年 YouXianMing. All rights reserved.
    //
    
    #import "POPSpringParameterController.h"
    #import "RangeValueView.h"
    #import "UIView+SetRect.h"
    #import "POP.h"
    #import "FontAttribute.h"
    #import "ForegroundColorAttribute.h"
    #import "NSMutableAttributedString+StringAttribute.h"
    
    #define  Width   [UIScreen mainScreen].bounds.size.width
    #define  Height  [UIScreen mainScreen].bounds.size.height
    
    @interface POPSpringParameterController ()
    
    @property (nonatomic, strong) UILabel  *secondsLabel;
    @property (nonatomic, strong) NSDate   *dateStart;
    
    @property (nonatomic, strong) RangeValueView *rangeSpeed;
    @property (nonatomic, strong) RangeValueView *rangeBounciness;
    @property (nonatomic, strong) RangeValueView *rangeMass;
    @property (nonatomic, strong) RangeValueView *rangeFriction;
    @property (nonatomic, strong) RangeValueView *rangeTension;
    
    @property (nonatomic, strong) UIButton *showView;
    
    @end
    
    @implementation POPSpringParameterController
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
    }
    
    - (void)setup {
        
        [super setup];
        
        [self initSecondLabel];
        
        [self initButton];
        
        [self initRangeViews];
        
        [self bringTitleViewToFront];
    }
    
    - (void)initSecondLabel {
        
        self.secondsLabel                = [[UILabel alloc] initWithFrame:CGRectMake(10, 10 + 64, 100, 20)];
        self.secondsLabel.attributedText = [self stringWithFloat:0.f];
        [self.view addSubview:self.secondsLabel];
    }
    
    - (NSAttributedString *)stringWithFloat:(CGFloat)value {
        
        // 字符串
        NSString *stringValue  = [NSString stringWithFormat:@"%.2f", value];
        NSString *secondString = [NSString stringWithFormat:@"seconds"];
        NSString *totalString  = [NSString stringWithFormat:@"%@ %@", stringValue, secondString];
        
        // 字体
        UIFont *allFont        = Font_Avenir(12);
        UIFont *numFont        = Font_Avenir_Light(20);
        
        FontAttribute *totalFont = [FontAttribute new];
        totalFont.font           = allFont;
        totalFont.effectRange    = NSMakeRange(0, totalString.length);
        
        FontAttribute *valueFont = [FontAttribute new];
        valueFont.font           = numFont;
        valueFont.effectRange    = [totalString rangeOfString:stringValue];
        
        ForegroundColorAttribute *textColor = [ForegroundColorAttribute new];
        textColor.color                     = [UIColor grayColor];
        textColor.effectRange               = NSMakeRange(0, totalString.length);
        
        ForegroundColorAttribute *numColor = [ForegroundColorAttribute new];
        numColor.color                     = [UIColor blackColor];
        numColor.effectRange               = [totalString rangeOfString:stringValue];
        
        NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:totalString];
        [attributeString addStringAttribute:totalFont];
        [attributeString addStringAttribute:valueFont];
        [attributeString addStringAttribute:textColor];
        [attributeString addStringAttribute:numColor];
        
        return attributeString;
    }
    
    - (void)initButton {
        
        CGFloat gap = Height - 60 - 40*4 - 64;
        
        CGFloat width                    = 100.f;
        self.showView                    = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, width)];
        self.showView.center             = CGPointMake(self.view.middleX, 64 + gap / 2.f);
        self.showView.backgroundColor    = [UIColor cyanColor];
        self.showView.layer.cornerRadius = self.showView.width / 2.f;
        [self.view addSubview:self.showView];
        [self.showView addTarget:self
                          action:@selector(doAnimation)
                forControlEvents:UIControlEventTouchUpInside];
    }
    
    - (void)doAnimation {
        
        // 移除动画
        [self.showView.layer pop_removeAllAnimations];
        
        POPSpringAnimation *spring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
        
        // 设置代理
        spring.delegate            = self;
        
        // 动画起始值 + 动画结束值
        spring.fromValue           = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)];
        spring.toValue             = [NSValue valueWithCGSize:CGSizeMake(2.f, 2.f)];
        
        // 参数的设置
        spring.springSpeed         = self.rangeSpeed.currentValue;
        spring.springBounciness    = self.rangeBounciness.currentValue;
        spring.dynamicsMass        = self.rangeMass.currentValue;
        spring.dynamicsFriction    = self.rangeFriction.currentValue;
        spring.dynamicsTension     = self.rangeTension.currentValue;
        
        // 执行动画
        [self.showView.layer pop_addAnimation:spring forKey:nil];
    }
    
    - (void)pop_animationDidStart:(POPAnimation *)anim {
        
        self.dateStart = [NSDate date];
    }
    
    - (void)pop_animationDidApply:(POPAnimation *)anim {
        
        CGFloat seconds                  = -[self.dateStart timeIntervalSinceNow];
        self.secondsLabel.attributedText = [self stringWithFloat:seconds];
    }
    
    - (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished {
        
        CGFloat seconds                  = -[self.dateStart timeIntervalSinceNow];
        self.secondsLabel.attributedText = [self stringWithFloat:seconds];
    }
    
    - (void)initRangeViews {
        
        self.rangeSpeed = [RangeValueView rangeValueViewWithFrame:CGRectMake(10, Height - 60, Width - 20, 0)
                                                             name:@"速度  Speed"
                                                         minValue:0.f
                                                         maxValue:20.f
                                                     defaultValue:12.f];
        [self.view addSubview:self.rangeSpeed];
        
        
        self.rangeBounciness = [RangeValueView rangeValueViewWithFrame:CGRectMake(10, Height - 60 - 40, Width - 20, 0)
                                                                  name:@"弹力  Bounciness"
                                                              minValue:0.f
                                                              maxValue:20.f
                                                          defaultValue:4.f];
        [self.view addSubview:self.rangeBounciness];
        
        
        self.rangeMass = [RangeValueView rangeValueViewWithFrame:CGRectMake(10, Height - 60 - 40*2, Width - 20, 0)
                                                            name:@"质量  Mass"
                                                        minValue:0.1
                                                        maxValue:10.f
                                                    defaultValue:1.f];
        [self.view addSubview:self.rangeMass];
        
        
        self.rangeFriction = [RangeValueView rangeValueViewWithFrame:CGRectMake(10, Height - 60 - 40*3, Width - 20, 0)
                                                                name:@"摩擦  Friction"
                                                            minValue:1
                                                            maxValue:50
                                                        defaultValue:30.486980];
        [self.view addSubview:self.rangeFriction];
        
        
        self.rangeTension = [RangeValueView rangeValueViewWithFrame:CGRectMake(10, Height - 60 - 40*4, Width - 20, 0)
                                                               name:@"拉力  Tension"
                                                           minValue:1
                                                           maxValue:1000
                                                       defaultValue:300];
        [self.view addSubview:self.rangeTension];
    }
    
    @end

    细节

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5004508.html
Copyright © 2011-2022 走看看