效果

 

源码

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
复制代码

 

细节

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐