calayer 与uiview

研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍。苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的。今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情。鉴于Core Animation的内容实在是非常繁杂,应用的Obj-C语言本身的特性也很多,所以写个备忘录记录一下,懂的人看了后如果发现了错误,还不吝指教。

 

1.UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是 这样)。它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等, 实际上内部都是在访问它所包含的CALayer的相关属性。

 

2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过

- (class) layerClass {return ([CAEAGLLayer class]);
}
使某个UIView的子类使用GL来进行绘制。

 

3.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。例如下面的代码

grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
会在目标View上敷上一层黑色的透明薄膜。

 

4.UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。

第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。

第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。

第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。

这三棵树的逻辑结构都是一样的,区别只有各自的属性。

 

5.动画的运作

UIView的主layer以外(我觉得是这样),对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成,动画持续 时间有个缺省时间,个人感觉大概是0.5秒。在动画时间里,系统自动判定哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧然后连续显示产生动画 效果。

 

6.坐标系系统(对position和anchorPoint的关系还是犯晕)

CALayer的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1, 也就是按照比例来设置。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。

某layer.anchorPoint = CGPointMake(0.f, 0.f);

如果这么设置,layer的左上角就会被挪到原来的中间的位置,

加上这样一句就好了

某layer.position = CGPointMake(0.f, 0.f);

 

7.真实例子的分析

2011012205344440.png

 

这是iphone上iBook翻页的效果,假设每一页都是一个UIView,我觉得一个页面是贴了俩个Layer,文字Layer显示正面的内容, 背面layer用文字layer的快照做affine翻转,贴在文字layer的后面。因为Layer可以设置显示阴影,也许后面的阴影效果没有使用单独 的一个layer来显示。至于这个曲面效果,我查了很多资料也没有结果,估计是使用了GL的曲面绘图?

 

8.最后一个让人恶心的。

layer可以设置圆角显示,例如UIButton的效果,也可以设置阴影显示,但是如果layer树中的某个layer设置了圆角,树中所有 layer的阴影效果都将显示不了了。如果既想有圆角又想要阴影,好像只能做两个重叠的UIView,一个的layer显示圆角,一个的layer显示阴 影.....

转载于:https://www.cnblogs.com/ligun123/archive/2011/09/18/2180473.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代换-置换网络(SP网络)

0x01 概述 代换-置换网络是一系列被应用于分组密码中相关的数学运算,高级加密标准(英语:AES)、3-Way、Kuznyechik、PRESENT、SAFER、SHARK、Square都有涉用。这种加密网络使用明文块和密钥块作为输入,并通过交错的若干…

Java SecurityManager getSecurityContext()方法与示例

SecurityManager类的getSecurityContext()方法 (SecurityManager Class getSecurityContext() method) getSecurityContext() method is available in java.lang package. getSecurityContext()方法在java.lang包中可用。 getSecurityContext() method is used to return an ob…

生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意:你提交的应该是一…

修改vs2005的键盘风格设置

由于以前都是用VC6.0,安装的VS.NET默认的键盘快捷键布局都是C#的。 修改方法: 选项 -> 环境 -> 键盘 。进去后选第一项:键盘映射方案 即可,还可以在这里自定义其他快捷键 转载于:https://www.cnblogs.com/jacktu/archive/…

【贪心】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法时间复杂性Python实现 个人主页:丷从心 系列专栏:贪心算法 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图, E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] …

asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010...

using Microsoft.Office.Interop.Excel;//转换为excel时,需要引用此命名空间 using ET;//转换为wps时,需要引用此命名空间using KSO;//转换为wps时,需要引用此命名空间当转换为excel时,需要引入Microsoft.Office.Interop.Excel.dl…

Java GregorianCalendar getActualMaximum()方法与示例

GregorianCalendar类getActualMaximum()方法 (GregorianCalendar Class getActualMaximum() method) getActualMaximum() method is available in java.util package. getActualMaximum()方法在java.util包中可用。 getActualMaximum() method is used to get the actual maxim…

一点一滴学习Linux--Mysql篇

1.查看是否安装了Mysql [rootlocalhost zhoulinghong]# rpm -qa |grep MySQL MySQL-server-community-5.1.22-0.rhel4 已经安装了。 2.安装mysql(rpm) [rootlocalhost zhoulinghong]# rpm -ivh MySQL-server-community-5.1.22-0.rhel4.i386.rpm …

HTML5 学习笔记

HTML5 学习笔记 前言 该学习笔记的相关学习视频:【狂神说Java】HTML5完整教学通俗易懂 目前笔记只有简单的例子和框架,将来在实践中会进一步学习和补充内容 目录HTML5 学习笔记前言网页基本信息网页基本标签标题标签段落标签换行标签水平线标签字体样式…

面向对象(方法的形式参数)

1,局部变量与成员变量的区别 1,在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上2,在内存中的位置不同 成员变量:在堆内存(成员变量属于对象,对象进…

保护机制

0x01 概述 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE&#xf…

机器学习降维算法一:PCA(主成分分析算法)

引言: 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向…

VS 2005模板丢失找回的办法

安装其他插件的时候,常常模板丢失,比较郁闷,以前就用土办法,重装VS来解决这个问题,这次终于弄清楚怎么回事了,可以采取下面两个步骤解决1。复制ProjectTemplates和ItemTemplates,保证VS能找到相…

dbms数据库管理系统_基本数据库管理系统(DBMS)能力问题和解答

dbms数据库管理系统This section contains the aptitude questions and answers on basic concepts of DBMS. You will find aptitude questions on DDL, DCL, DML, DQL, TCL statements and other related topics. 本节包含有关DBMS基本概念的能力问题和解答。 您将找到有关DD…

面向对象(封装对象private关键字)

1.面向对象(封装的概述) A:封装概述 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。B:封装好处 隐藏实现细节,提供公共的访问方式提高了代码的复用性提高安全性。C:封装原则 将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公…

Codeforces Global Round 13 C

C. Pekora and Trampoline 题意:对于数组a,每次出发开始可以选择任意元素作为起始点,然后在数组上移动,落点为i a[i],直至超出数组范围,每次经过的点的值减一(先移动再减/直至减到1为止&#…

一个简单的pwn例子---read函数

内容&#xff1a; #include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50); } int main() {func();return 0; }我们要做的是利用溢出执行exploit函数 分析&#xff1a; 先执行func函数&#xff0c;func函数…

重载运算符 减号_在C / C ++中使用减号(-)运算符将两个数字相加

重载运算符 减号Given two numbers, and the task is to find their addition using the minus (-) operator. 给定两个数字&#xff0c;任务是使用减(-)运算符查找它们的加法 。 As we have discusses in C/C arithmetic operators that plus () operator adds the numbers a…

【操作系统】互斥:软件解决方法

互斥&#xff1a;软件解决方法 算法一 算法思路 预留一个全局内存区域&#xff0c;并标记为turn。进程&#xff08;P0或P1&#xff09;想进入它的临界区执行时&#xff0c;要先检查turn的内容。若turn的值等于进程号&#xff0c;则该进程可以进入它的临界区&#xff1b;否则…

Oracle为即将发布的11g开发平台进行预演

Oracle为即将发布的11g开发平台进行预演 Oracle JDeveloper是一个免费的整合开发环境&#xff0c;它为模块化、开发、调试、优化、部署Java应用程序和Web服务提供了端到端&#xff08;end-to-end&#xff09;的支持。1&#xff09;完全支持J2EE5.0&#xff0c;带有EJB3.0&#…