您的位置:首页 > 编程语言 > Java开发

POPSpring动画参数详解

2015-11-29 11:34 260 查看
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


细节

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: