CALayer(持续更新)

CALayer

The CALayer class manages image-based content and allows you to perform animations on that content. Layers are often used to provide the backing store for views but can also be used without a view to display content. A layer’s main job is to manage the visual content that you provide but the layer itself has visual attributes that can be set, such as a background color, border, and shadow. In addition to managing visual content, the layer also maintains information about the geometry of its content (such as its position, size, and transform) that is used to present that content onscreen. Modifying the properties of the layer is how you initiate animations on the layer’s content or geometry. A layer object encapsulates the duration and pacing of a layer and its animations by adopting the CAMediaTiming protocol, which defines the layer’s timing information.

CALayer类能管理基于图片的内容,允许你在图片内容上执行动画.Layer经常被用来当做view存储容器,其也能够脱离view独立的显示内容.一个layer的主要工作就是管理你提供的可视化对象,但是layer它自身也有很多可见属性可以设置,诸如背景色,边框以及阴影.它还额外的管理其他可视化的一些内容.layer还包括了相关坐标信息用来在屏幕上显示.修改layer的属性可以在屏幕上产生动画效果.一个layer对象将一个layer动画的时间以及步骤通过继承 CAMediaTimeing 协议封装起来,这个协议决定了 layer 的时间轴信息.

 

1. 测试UIImageView与CALayer之间的关系

以下为打印信息:

2014-04-18 10:21:28.406 StudyCoreAnimation[672:60b] <CGImage 0x16521520>
2014-04-18 10:21:28.409 StudyCoreAnimation[672:60b] {{100, 100}, {100, 100}}

很明显,layer的内容是图片,坐标系也是与View的一致.

 

延时两秒后改变一些值,并重新检测layer值的变化.

2014-04-18 10:27:40.292 StudyCoreAnimation[685:60b] <CGImage 0x17656050>
2014-04-18 10:27:40.295 StudyCoreAnimation[685:60b] {{100, 100}, {100, 100}}
2014-04-18 10:27:40.297 StudyCoreAnimation[685:60b] 0.500000
2014-04-18 10:27:42.489 StudyCoreAnimation[685:60b] {{100, 100}, {200, 200}}
2014-04-18 10:27:42.491 StudyCoreAnimation[685:60b] 0.900000

 

你会发现,layer的值与View中设置的值是一致变化的.是否我们可以理解成layer是View的容器,View中设置的值直接影响layer的行为.那如果我们直接改变layer的值会影响View的相关属性么?

2014-04-18 10:32:28.157 StudyCoreAnimation[699:60b] <CGImage 0x16536770>
2014-04-18 10:32:28.161 StudyCoreAnimation[699:60b] {{100, 100}, {100, 100}}
2014-04-18 10:32:28.164 StudyCoreAnimation[699:60b] 0.500000
2014-04-18 10:32:30.364 StudyCoreAnimation[699:60b] {{100, 100}, {200, 200}}
2014-04-18 10:32:30.366 StudyCoreAnimation[699:60b] 0.900000

 

目前可以看出,设置View上的相关属性实际上是在直接设置layer的属性.一个View与一个layer一一绑定,我们来试试添加一个新的layer到View中看看效果.

2014-04-18 10:41:25.063 StudyCoreAnimation[33874:60b] {{0, 0}, {50, 50}}

至少从打印信息可以看出,新添加的layer设置的frame值是以这个View的bound值为基准的,我们再来看看设置这个View自己的layer时是否会影响新添加的layer.

2014-04-18 10:47:04.927 StudyCoreAnimation[34006:60b] {{0, 0}, {50, 50}}

你会发现,绑定的layer的透明度以及坐标更改了,它影响到了新添加的layer,但是,它自己size的改变却没有影响到新添加的layer的size的改变.

新layer的size并没有随着绑定layer的值的改变而按比例改变.

想按照等比例缩放,需要自己设置等比例的值来缩放.

而且,执行看变化的时候还有动画改变的效果,如果你要关闭动画效果,用下面的方式就行了:

还可以进行layer动画速度的设置:

 

设置mask

这是用来遮罩的图片mask

显示的实际效果:

 

小结:

1. 被View绑定的layer,其参数的改变,如果涉及到size的修改并不会影响新添加layer的size.

2. 绑定的layer参数改变的时候,是没有动画效果的.

3. 新添加进来的layer在修改值时有动画效果,我们可以关闭动画也可以开启动画,并设置动画的速度.

4. 初始化新layer时要记得设置初始frame.

 

 

2. UIView animateWithDuration与layer的关系

2014-04-18 12:56:44.395 StudyCoreAnimation[35617:1303] {{100, 100}, {200, 200}}
2014-04-18 12:56:44.397 StudyCoreAnimation[35617:1303] 0.100000

从打印结果可以看出,UIView中使用的animateWithDuration方法的动画改变了layer的值.

如果对layer进行动画,会有什么效果呢?

2014-04-18 13:06:22.012 StudyCoreAnimation[35799:60b] {{100, 100}, {100, 100}}
2014-04-18 13:06:22.015 StudyCoreAnimation[35799:60b] 1.000000

从打印结果可以看出,对View中layer执行动画后,它的值一直都没有改变.与UIView的动画有着本质的区别.

动画是2s,我在1s的时候打印了opacity的值

2014-04-18 13:10:52.116 StudyCoreAnimation[35847:60b] {{100, 100}, {100, 100}}
2014-04-18 13:10:52.117 StudyCoreAnimation[35847:60b] 0.100000

从结果可以看出,layer一开始的值就是被设置成了0.1,动画的途中其打印值还是为0.1,从这里大概可以了解CABasicAnimation的原理了.它一次只能设定一个值,当给layer提交动画时,我猜测发生了如下现象:

1. 完整的拷贝了被绑定的layer

2. 隐藏被绑定的layer

3. 动画结束时移除拷贝的layer并显示出被绑定的layer

我来验证我的看法,如下图所示,我把View动画设置成3s,然后,在1s的时候打印出该View的layer的值,发现早就已经设置成最终结果了.

再来看看removedOnCompletion参数

从以上可以看出,动画结束了效果没有被移除,效果还在,但是alpha的值还是为1,执行了removeAllAnimations时才还原.

 

小结:

1. View的动画实际上是对layer动画的封装,并在动画刚开始的时候就已经把layer相关值设定好了,动画只是一个过程

2. CABasicAnimation动画结束后是需要设定一个layer相关改变的值的,否则会还原

3. 另外一种解释现象的方法是:动画并没有实时改变layer的值,动画只是一种提交给系统用来在layer上进行绘制的一个渲染过程,并不是实时的改变layer的值,动画效果只关注你提供layer的初始值,layer的结束值,然后渲染出效果,并不关心动画结束后,layer的参数变化,他是脱离于layer的.

时间: 2024-08-06 21:55:59

CALayer(持续更新)的相关文章

300+篇运维、数据库等实战资料免费下载(文章+PDF+视频,持续更新)

2017年已过去一半,在此小编为大家精心整理了2017上半年热点事件解析.实战技术资料以及特别策划短视频系列,希望可以帮助大家更深入地回顾上半年的技术热点,并储备更充足的技术干粮继续2017的下一半. PART 1 峰会回顾资料 云栖大会 [上海云栖大会]2017云栖大会上海峰会资料合计(现场视频+PDF下载) [成都云栖大会]2017云栖大会成都峰会资料合计(现场视频+PDF下载) [南京云栖大会]2017云栖大会南京峰会资料合计(现场视频+PDF下载) 技术峰会 [运维/DevOps峰会]

IOS开发--常用工具类收集整理(Objective-C)(持续更新)

 前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就不要傻傻的重复造轮子了,还是提高工作效率,早点完成工作早点回家陪老婆孩子. 所以下面备份的常用工具类一定是你需要的. 前提:你有一定的开发经验,知道它们在开发的什么地方需要,你都不知道用在哪里,那你需要个毛啊,还是好好另外学好基础吧.少儿不宜,请离开哦. 插件目录列表:(持续更新和添加) 1.UI

给大家推荐几款个人觉得特别好用的编程及日常用的软件(持续更新!)

原文:给大家推荐几款个人觉得特别好用的编程及日常用的软件(持续更新!) 子曾经曰过:"工欲善其事,必先利其器!",呵呵,好用的软件必然会对工作和生活提高很多效率,下面我就把我个人觉得不错的软件整理出来,这里可能之前提到过几个,不过没关系,以后我再发现好用的东西会在这里持续更新! 宝典总数:[27个]  更新时间:[2015年1月29日09:04:21] ※宝典1:源代码管理软件-"CODEHELP" CodeHelp是专门为我们程序员设计的一款源代码管理软件.它能方

阿里巴巴大数据计算平台MaxCompute(原名ODPS)全套攻略(持续更新20171122)

  概况介绍 大数据计算服务(MaxCompute,原名ODPS,产品地址:https://www.aliyun.com/product/odps)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全.本文收录了大量的MaxCompute产品介绍.技术介绍,帮助您快速了解MaxCompute/ODPS. MaxCompute 2.0:阿里巴巴的大数

iOS之github第三方框架(持续更新)

1.MBProgressHUD MBProgressHUD是一个开源项目,实现了很多种样式的提示框 使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大,很多项目中都有使用到. 到Github上可以下载到项目源码https://github.com/jdg/MBProgressHUD 百度云链接: http://pan.baidu.com/s/1pKa5JrP 密码: qw6k 百度云链接: http://pan.baidu.com/s/1dErLfrz 密码: ixbn (小码哥进一步

开源个asp.net框架,方便扩展,会持续更新,欢迎使用

问题描述 会持续更新,当前用到一个推送的系统上面下载地址:BuildsuperoftheenterprisewebsiteLicenseWTFPL(DoWhattheFuckYouWanttoPublicLicensehttps://github.com/anak10thn/WTFPL)EnvironmentDevelopinglanguage:C#FrameworkVersion:4.0Database:SQL2005orlaterCurrentfunction:1.Multilanguage

这些开源项目,你都知道吗?(持续更新中...)[原创]

原文 这些开源项目,你都知道吗?(持续更新中...)[原创] Json.NET  http://json.codeplex.com/ Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型等)和Json的转换.   Math.NET http://www.mathdotn

seo问答交流(持续更新中)

通过问答交流的形式,可以帮助我们提升对于seo技术的认知,更深刻的理解相关概念,解答疑惑.以持续更新的方式,解答常见的网站seo优化问题,笔者会第一时间回复所有问题.seo问答交流详细内容有很多,请仔细阅读: seo问答交流 1,问:如何查询移动端网站的收录? 答:通过百度站长平台验证网站,通过后台的索引量查询收录,较为准确. 2,问:每天都在更新文章,但是不收录? 答:可以用排除法,网站是否被搜索引擎蜘蛛爬取过:是否为处于审核期的新站点:网站是否由于过度seo优化,被黑等问题处于降权中:更新的

Android LookAround开元之旅(持续更新中...)

http://blog.csdn.net/lancees/article/details/17696805 应用介绍 随便瞧瞧是一款为android用户量身定做的免费图文资讯软件 集美食,星座,写真,文学,美女等频道于一体 界面简洁,操作流畅,图文分享,个性收藏 是广大卓粉的必备神器 APK下载 -->http://apk.91.com/Soft/Detail.aspx?Platform=Android&f_id=40495952         工程简介以下是代码结构图: 该工程用到以下开