【动画2】CALayer动画
一)UIView动画
二)CoreAnimation动画
一、CoreAnimation动画之CALayer的使用
Layer动画和UIView动画十分相似。只需设置属性的初始值、结束值和动画执行时间,CoreAnimation会帮我们完成动画的中间过程。相对于上一篇的UIView动画,CALayer动画有着更多可设置的属性(如下列表),而且CALayer的很多子类还额外添加了更多属性(如CAShapeLayer、CAGradientLayer等),因此可实现更多的动画效果。
1.位置和大小
bounds
position
tranform:移动、缩放、旋转
2.边框
borderColor:边框颜色
borderWidth:边框宽度
cornerRadius:圆角
3.阴影
shadowOffset
shadowOpacity
shadowPath
shadowRadius
4.内容
contents
mask
opacity
首先,我们用layer动画实现一个简单的登录页面:
UITextField *username = [[UITextField alloc] initWithFrame:CGRectMake( -SCREENW -TEXTFIELDW , 100, TEXTFIELDW, TEXTFIELDH)];[username setBorderStyle:UITextBorderStyleRoundedRect];[username setPlaceholder:@"请输入用户名"];_username = username;[self.view addSubview:username];UITextField *password = [[UITextField alloc] initWithFrame:CGRectMake(-SCREENW -TEXTFIELDW, 160, TEXTFIELDW, TEXTFIELDH)];[password setBorderStyle:UITextBorderStyleRoundedRect];[password setPlaceholder:@"请输入密码"];password.delegate = self;_passwork = password;[self.view addSubview:password];//在iOS中如果使用普通的动画则可以使用UIKit提供的动画方式来实现,如果想实现更复杂的效果,则使用Core Animation//Core Animation中的Animation只是普通的数据模型,只要创建模型的实例对象,直接设置对象的属性即可。//CABasicAnimation描述了layer动画,通过keyPath参数来指定需要改变的属性,然后设置对应属性的fromValue和toValue,最后,设置动画的持续时间。CABasicAnimation *flyRight = [CABasicAnimation animationWithKeyPath:@"position.x"];flyRight.fromValue = @(username.frame.origin.x);flyRight.toValue = @(SCREENW*0.5);flyRight.duration = 2.0;flyRight.fillMode = kCAFillModeBoth;//现在动画已经设置好了,可以将它设置给layer:[username.layer addAnimation:flyRight forKey:nil];[password.layer addAnimation:flyRight forKey:nil];
现在两个输入框确实以我们设定的动画形式出现,不过当动画结束后,输入框也随之不见了。这是为什么呢?
动画执行的时候,并非textfield本身进行移动变化,而是它的替身--呈现层(presentation layer)。既在动画开始时,textfield会隐藏,呈现层出现,在动画结束时呈现层从屏幕中移除,textfield重新变成可见,但还是在初始位置上。为了让动画停留在结束后的位置上,需要用到CABasicAnimation的removedOnCompletion属性:
flyRight.removedOnCompletion = NO;
//同时设置
flyRight.fillMode = kCAFillModeBoth;
好了,现在再看效果,动画结束后,输入框保留在最终的位置上!
不过现在有出现了一个问题,就是点击输入框,并没有弹出键盘。因为你点击的只是textfield的替身,并不能响应用户事件。为了解决这个问题,可以移除动画,并且显示真实的的textfield、更新textfield的位置属性,所以取消设置removedOnCompletion属性,改为设置textfield的位置属性:
username.layer.position = CGPointMake(SCREENW*0.5, username.layer.position.y);
password.layer.position = CGPointMake(SCREENW*0.5, password.layer.position.y);
现在运行,可以看到在动画结束之后,输入框保留在最终位置上,并且可以与用户进行交互了!
二、动画代理
有时我们希望知道动画什么时候开始或结束,可以通过动画代理实现:
fly.delegate = self;
实现动画开始和结束的方法:
- (void)animationDidStart:(CAAnimation *)anim{NSLog(@"start");
}- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{NSLog(@"stop");
}
运行代码,在动画开始和结束时,会有对应的Log输出。
不过一个CABasicAnimation对象可以添加到多个CALayer对象上,要怎么确定是哪个layer动画的回调呢?CAAnimation类和其子类遵守KVC,也就是在运行时,你可以像字典一样,给它设置新的属性。
[fly setValue:@"form" forKey:@"name"];
[fly setValue:login.layer forKey:@"layer"];
上面的代码给fly设置了key为name,值为form的属性,现在可以在代理回调方法中根据name的值,从而区分不同的动画。
同时设置了key为layer,值为view.layer的属性,因此可以在回调中获取到动画对应的layer。
例如,在动画结束时,加上放大动画:
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{NSLog(@"stop");NSString *name = [anim valueForKey:@"name"];if([name isEqualToString:@"form"]){CALayer *layer = [anim valueForKey:@"layer"];CABasicAnimation *pulse = [CABasicAnimation animationWithKeyPath:@"transform.scale"];pulse.fromValue = @(1.25);pulse.toValue = @(1.0);pulse.duration = 0.4;[layer addAnimation:pulse forKey:nil];}
}
注意到,创建动画时,我们使用的是animationWithKeyPath:方法,在任意时刻,可以根据这里设置的key,取消动画。
[info.layer removeAnimationForKey:@"infoappear"];
三、CAAnimationGroup动画组
动画组CAAnimationGroup继承自CAAnimation,可以保存一组动画对象,将CAAnimationGroup加入CALayer之后,可以同时执行多个动画效果(也可以通过设置单个动画的beginTime来分时执行)
CAAnimationGroup *gruopAnimation = [CAAnimationGroup animation];gruopAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];gruopAnimation.duration = 0.5;gruopAnimation.fillMode = kCAFillModeBackwards;CABasicAnimation *scaleDown = [CABasicAnimation animationWithKeyPath:@"transform.scale"];scaleDown.fromValue = @(3.5);scaleDown.toValue = @(1.0);CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];rotate.fromValue = @(M_PI_4);rotate.toValue = @(0.0);CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"transform.opacity"];fade.fromValue = @(0.0);fade.toValue = @(1.0);gruopAnimation.animations = @[scaleDown,rotate,fade];[login.layer addAnimation:gruopAnimation forKey:nil];
四、CoreAnimation实现弹簧效果
在上一篇文章介绍的UIView.animateWith。。。。方法中,我们仅仅能设置阻尼(damping)和初始速度(inital velocity)两个变量,因此有时候看起来并不十分自然。而可以通过CoreAnimation的CASpringAnimation类来实现更真实的弹簧效果,可设置的属性有:
damping - 阻尼(默认10.0)
mass- 质量(默认1.0)
stiffness-刚度(默认100.0)
inital velocity-初始速度(0.0)
因为CASpringAnimation是CABasicAnimation的子类,所以用法是一样的:
CASpringAnimation *spring = [CASpringAnimation animationWithKeyPath:@"transform.scale"];spring.beginTime = CACurrentMediaTime()+0.8;spring.damping = 2.0;spring.fromValue = @(1.25);spring.toValue = @(1.0);spring.duration = spring.settlingDuration;[login.layer addAnimation:spring forKey:nil];
五、CAKeyframeAnimation
基础动画设置了fromValue和toValue,CoreAnimation根据这两个参数,在指定的一段时间内逐步改变指定的属性值。例如,当想要将layer从45°旋转到-45°时,只需要设置这两个角度值,动画过程中的值由CoreAnimation去处理。
CAKeyframeAnimation使用values属性代替了fromValue和toValue,values保存的是动画的转折点。另外还需要提供到达每个转折点的时间。
CAKeyframeAnimation *wobble = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];wobble.duration = 0.25;wobble.repeatCount = 4;wobble.values = @[@(0.0), @(-M_PI_4/4), @(0.0), @(M_PI_4/4), @(0.0)];wobble.keyTimes = @[@(0.0),@(0.25),@(0.5),@(0.75),@(1.0)];[self.testView.layer addAnimation:wobble forKey:nil];
*如果需要改变的属性值为struct类型,例如position的类型为CGPoint,transform的类型为CATransform3D,bounds值为CGRect,均需”包装”成NSValue。
原文地址:http://blog.csdn.net/dolacmeng/article/details/52208367
demo代码:https://github.com/dolacmeng/AnimationDemo
相关文章:

nginx+tomcat+memcache实现负载均衡、session共享
实验架构图: Table of Contents 1、配置tomcat 2、安装memcache 3、查看tomcat和memcache是否配置好 4、nginx实现负载均衡: 5、客户端进行测试: 6、验证结论: 7、总结: 实验环境: linux redhat6.…

(转)二叉树系列面试问题
转自 :http://blog.csdn.net/luckyxiaoqiang/article/details/7518888/ 版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重要的数据结构,尤其是二叉树。二…

百度UEditor开发案例(JSP)
本案例的开发环境:MyEclipsetomcatjdk 本案例的开发内容:用百度编辑器发布新闻(UEditor的初始化开发部署)编辑已发过的新闻(UEditor的应用——编辑旧文章)上传附件、图片等 由于百度编辑器强大的功能&a…
iOS中的动力学:Dynamics【1】
iOS7建议我们创建的界面具有物理特性,而不只是像素的集合,可以响应触摸、手势、屏幕方向改变等事件,让用户与界面之间有更深入的交互,而不是像iOS6那样在软件界面上模仿现实世界的纹理而已。或许你会认为创建感觉上真实的界面比创…

自动化运维工具Saltstack(一)
1、saltstack简介: 什么是saltstack? saltstack是基于python开发的一套C/S架构配置管理工具 使用SSL证书签方的方式进行认证管理 号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作 采用RSA Key方式确认身份 传输采用AE…
【UIDynamic例子】挂起的方块
通过前面的动力学小Demo(本文默认你已经看过这篇Blog:传送门),我们对UIKit中的UIDynamic已经有了初步的认识。现在我们写个更加有趣的Demo:模拟一个用弹性绳子挂起的小方块,用户可以将它拖动到屏幕任意位置…

IIS7 配置PHP服务器
安装PHP Manager: 1)访问 http://phpmanager.codeplex.com/releases/view/69115 下载PHP Manager。其中,x86 为32位 Windows 系统使用,x64 为64位 Windows 系统使用,请根据使用的 Windows 系统情况下载 2)下…
在文本框中提示用户输入内容格式的方法
希望达到的效果: 方法一:鼠标点击文本框时文字消失 <input id"login_name" type"text" οnblur"javascript:check_login_name();" οnfοcus"if(this.value支持英文及数字组合) this.value;this.style.color#000&…

saltstack实现haproxy+keepalived负载均衡+高可用(二)
一键部署haproxykeepalived实现负载均衡高可用 实验环境: !!!! 特别注意: www.westos.org为test1的minion名字 test1: 172.25.1.11 nginx master minion test2: 172.25.…

iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
新建一个Category,命名为UIColorHex,表示UIColor支持十六进制Hex颜色设置。 UIColorHex.h文件, #import <UIKit/UIKit.h> #define RGBA_COLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255…
iOS顶部菜单栏
封装的一个顶部菜单栏,使用懒加载(选择后加载当前页及前后各一页),自适应标题长度。 下载: Github:https://github.com/dolacmeng/JXChannelSegment 用法: //init Segment segment [[JXSegme…

Mac环境下svn的使用
CHENYILONG BlogMac环境下svn的使用 Mac环境下svn的使用 在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不…

zabbix简介及基本安装(一)
zabbix简单介绍: 官网:可以进官网查看一下:https://www.zabbix.com/cn/ //英语能力有限的读者可以将由上角的语言调成汉语方便查看 功能:网络监控、服务器监控、云监控、服务监控等。 介绍:zabbix([…

顺序表应用6:有序顺序表查询
顺序表应用6:有序顺序表查询 Time Limit: 7MS Memory Limit: 700KBSubmit StatisticProblem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数(1<n<20000),任意输入一个整数,判断该整数在顺序表中是否存在。…

LA 5717枚举+最小生成树回路性质
1 /*LA 57172 《训练指南》P3433 最小生成树的回路性质4 在生成的最小生成树上,新增一条边e(u,v)5 若原图上u到v的路径的最大边大于e,则删除此边,加上e,否则不变。6 7 若原图上u到v的路径的最大边的产生:BFS/DFS都可 &…

【Runtime】动态添加方法demo
今天写一个小demo来演示下runtime的消息转发和动态添加方法。 一般项目中都会有保存当前登录用户资料的需求,我们可以直接将登录成功后的用户信息分别保存到NSUserDefaults中: [def setObject:"JackXu" forKey:"UserName"];[def set…

Zabbix之主机的添加与删除(二)
接着上一篇内容继续讲: 环境等都是建立在上一篇内容的基础上的,见https://blog.csdn.net/weixin_41922887/article/details/83755271 redhat6 test1: 172.25.1.11 zabbix-agent redhat7 server: 172.25.1.1 …

昨天网上感觉好冷,睡在席子上都是感觉打哈欠
今天爸妈也是休息一天,中午听说是要到外婆家去,不过家里就不知道会不会有一个团圆聚餐了,还有伴月就是国庆解,那时就要吧这个推掉值班的事情做好下。 转载于:https://www.cnblogs.com/bkchengzheng/p/5874328.html
几行代码实现神奇移动的过渡动画
1.效果如图: 2.实现: 假设需求为如上图,点击ViewController01后,ViewController01上的两张图片,移动到ViewContoller02中,其实两个ViewController的View上分别放置了这两张图,JXMagicMove就是实…

php字符串处理函数相关操作
<?php//获取tech和98426这两个字符串$str "http://info.meadin.com/tech/98426_1.shtml";echo $newstr substr($str,7,strlen($str)); //info.meadin.com/tech/98426_1.shtml$arr explode(/,$newstr);$num $arr[1];//tech$user strstr($arr[2], _, true); /…

介绍Zabbix的两种监控模式(主动模式和被动模式)
Zabbix agent检测分为两种模式:主动模式和被动模式 被动模式,也是默认的Zabbix监控模式,被动模式是相对于proxy来说的。proxy主动发送数据就是主动模式,proxy等待server的请求再发送数据就是被动模式。主动模式有个好处就是可以有…

【Step By Step】将Dotnet Core部署到Docker下
一、使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章《尝试.Net Core—使用.Net Core Entity FrameWork Core构建WebAPI(一)》一致。 但是在我们这里,由于docker中无法部署sql server,所以我采…

ipad无法与itunes同步,提示因为这台电脑不再被授权使用在此ipad上购买的项目解决方案...
1、iOS设备用数据线连接到电脑;2、打开电脑上的iTunes 11,按CtrlB键调出菜单栏,按CtrlS键调出边栏;在边栏的 设备 下面看到你的iOS设备;3、点击菜单栏中的商店,点击 对这台电脑授权,输入你的App…

iOS根据字节数截取字符串
最近项目有个需求,文章的作者最多显示7个中文字,英文字符算半个中文字,超过7个中文字,则显示:前7个中文字...,使用NSString的length方法,不管是一个中文还是英文字符,都是返回1。因此…

搭建Zabbix分布式监控
1、实现zabbix监控nginx 实验环境: server1 172.25.1.1 server redhat7 test1 172.25.1.11 agent redhat7 在“手动添加”主机的基础上进行扩展 开启服务: [rootserver ~]# systemctl…

Codeforces Round #372 (Div. 2), problem: (B) Complete the Word
水题,每次截取长度为26的字符串,然后直接进行修改就可以 然而本弱渣昨天wa看很久 include<bits/stdc.h> using namespace std; int n,c; int ans[30]; int main() { string s; cin>>s; int tt0; int ns.size(); if(n<26) { cout<<&…

百练 2973 Skew数 解题报告
思路: 计算出每一个skew数的不同位数表示的权值,然后用该位与权值相乘。用int数组来装权值,用char数组来装skew数。 代码: #include<stdio.h> #include<string.h> int main() {int i, k, sum;int base[32];char skew[…

【Python】在Mac系统中安装Pygame
我们通过Homebrew来安装Pygame,Homebrew是Mac OSX上的软件包管理工具,如果还没安装Homebrew,将以下命令粘贴至终端先安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install…

zabbix部署onealert云警告平台
onealert告警功能 告警 All In One,支持微信、邮箱、短信、APP、电话告警支持接入 Zabbix、Nagios、阿里云、腾讯云、监控宝等等告警信息灵活的分配策略,可灵活的分配告警信息发送给相关人员微信、邮箱、app 等告警方式全部免费实验环境: 首…

StringBuilder、StringBuffer、String区别
相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天重新把这个概念给大家复习一下,顺便牵出 J2SE5.0 里面带来的一个新的字符操作的类—— StringBuilder …