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(, + , , )];
self.secondsLabel.attributedText = [self stringWithFloat:.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();
UIFont *numFont = Font_Avenir_Light(); FontAttribute *totalFont = [FontAttribute new];
totalFont.font = allFont;
totalFont.effectRange = NSMakeRange(, 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(, 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 - - * - ; CGFloat width = .f;
self.showView = [[UIButton alloc] initWithFrame:CGRectMake(, , width, width)];
self.showView.center = CGPointMake(self.view.middleX, + gap / .f);
self.showView.backgroundColor = [UIColor cyanColor];
self.showView.layer.cornerRadius = self.showView.width / .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(.f, .f)];
spring.toValue = [NSValue valueWithCGSize:CGSizeMake(.f, .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(, Height - , Width - , )
name:@"速度 Speed"
minValue:.f
maxValue:.f
defaultValue:.f];
[self.view addSubview:self.rangeSpeed]; self.rangeBounciness = [RangeValueView rangeValueViewWithFrame:CGRectMake(, Height - - , Width - , )
name:@"弹力 Bounciness"
minValue:.f
maxValue:.f
defaultValue:.f];
[self.view addSubview:self.rangeBounciness]; self.rangeMass = [RangeValueView rangeValueViewWithFrame:CGRectMake(, Height - - *, Width - , )
name:@"质量 Mass"
minValue:0.1
maxValue:.f
defaultValue:.f];
[self.view addSubview:self.rangeMass]; self.rangeFriction = [RangeValueView rangeValueViewWithFrame:CGRectMake(, Height - - *, Width - , )
name:@"摩擦 Friction"
minValue:
maxValue:
defaultValue:30.486980];
[self.view addSubview:self.rangeFriction]; self.rangeTension = [RangeValueView rangeValueViewWithFrame:CGRectMake(, Height - - *, Width - , )
name:@"拉力 Tension"
minValue:
maxValue:
defaultValue:];
[self.view addSubview:self.rangeTension];
} @end
细节