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(, + , , )];
- 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
细节
POPSpring动画参数详解的更多相关文章
- iOS:核心动画的详解介绍:CAAnimation(抽象类)及其子类
核心动画的详解介绍:CAAnimation(抽象类) 1.核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它 ...
- Android Animations 视图动画使用详解!!!
转自:http://www.open-open.com/lib/view/open1335777066015.html Android Animations 视图动画使用详解 一.动画类型 Andro ...
- VLC命令行参数详解
VLC命令行参数详解 2012-11-29 14:00 6859人阅读 评论(0) 收藏 举报 Usage: vlc [options] [stream] ...You can specify mul ...
- Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解
只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- iptables参数详解
iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...
- chattr的常用参数详解
chattr的常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际生产环境中,有的运维工程师不得不和开发和测试打交道,在我们公司最常见的就是部署接口.每天每个人部署的 ...
- mha配置参数详解
mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...
- $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解
[一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...
随机推荐
- WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法
wordpress登录后台如果打开速度慢,一般分为两部分,第一部分是php虚拟主机的原因,其中主机的原因,又分为很多种情况.第二部分就是WordPress程序本身的问题.这里无忧主机小编主要是讲第二部 ...
- FileBeat读取特征目录及特征文件,为不同的path生成不同的Kafka Topic
进入日志收集及监控报警这个领域,感觉一切都要从新学习. 现在周五,这周有两天用来踩坑了. 作些记录. 第一个遇到的问题,就是不同的应用组件,在k8s里,会生成不同的日志,如何采集到这些不同的日志呢? ...
- JAVA类课后练习
1.Pg168--2 package com.hanqi; import java.util.Scanner; public class Rectangle { Rectangle() { //完成初 ...
- CCF CSP 201509-4 高速公路
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-4 高速公路 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在 ...
- 【LOJ】#2063. 「HAOI2016」字符合并
题解 dp[i][j][S]表示区间[i,j]内剩余的数位状压后为S的最大值 这样转移起来不就是\(n^3 2^8\)了吗 冷静一下,我们可以发现一段区间内剩下的数位的个数是一定的,也就是我们可以在枚 ...
- JS 如何准确获取当前页面URL网址信息
在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblogs. ...
- Gitlab Issue Tracker and Wiki(二)
一. 引用问题 1. 登陆 Gitlab服务器 2. 进入到super-git项目 3. 创建一个问题 4. 查看创建问题的号码,可以在下图找到. 5. 对代码进行提交去关闭这个问题,首先把项目在本机 ...
- 安卓RecylerView嵌套和事件处理
最近遇到了一个需求:RecylerView的某一项为listView,即listView嵌套,且要求内部ListView可以滑动,高度固定. 如果直接简单的写完,会发现有两个问题: 1.内部listV ...
- window.open()/剪切板ZeroClipboard
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于mysql_connect CLIENT_MULTI_RESULTS
自己写了一个mysql存储过程,以为php有用于调用存储过程的内建函数,查了一下发现只能用mysql_query(call pro())这样的方式,我认为从本质上也就相当于在mysql命令行里执行语句 ...