一、图层的几何

图层的几何简单通俗,图层的所有几何属性(包括矩阵变换),都可以有隐式和显式动画。

图层几何的属性:

1.position是CGPoint值,她指定图层相对于她图层的位置,该值基于父图层的坐标系。

2.bounds是CGRect值,她指定图层的原点(bounds.size)和图层的原点(bounds.origin - 当重写图层的drawRect的时候,bounds.origin可以作为图形上下文的原点)。

3.frame是隐式的属性,她是position,bounds,anchorPoint和Transform属性的结合结果。

  特别说明:设置新的frame将会改变图层的position和bounds属性,但是frame自身并没有

被保存!同时,bounds.origin不受干扰。

4.anchorPoint(锚点)是CGPoint值,她指定一个基于图层bounds的符合位置坐标系的位置。锚点指定了bounds相对于position的值,同时也可以作为transform的支点。锚点使用单元坐标系表示,(0,0)点接近图层的原点,(1,1)点是原点的对角点,改变图层的父图层的变化属性将会影响到锚点的方向,具体变化取决于父图层坐标系Y轴。

附加:

CALayer的重要属性:

@property CGPoint position;

@property CGPoint anchorPoint;

anchorPoint 中文字面意思是锚点,我理解为固定的layer的旋转点

1.anchorPoint 在Layer中初始化的是(0.5,0.5),这个坐标值是相对于Layer本身的bounds(CGRectmake(0,0,width,height))的比例值;

2.anchorPoint 的在Layer的左上角、右下角分别为(0,0),(1,1),这说明他遵守

了Frame和bounds也是左手坐标系;

3.anchorPoint 的所处的坐标系其实就是它的superLayer,这个跟UIView中的superView

于subView的概念一样,super是爷爷,sub是儿子,爷爷只有一个,但是儿子却有很多;

4.再来看看position的原始定义: The layer’s position in its superlayer’s coordinate space。 
中文可以理解成为position是layer相对superLayer坐标空间的位置,很显然,这里的位置是根据anchorPoint来确定的。

公式可以理解:

首先要清楚,UIView的frame属性是由center和bounds属性计算得到的。
frame.origin.x = center.x - bounds.size.width/2.0;
frame.origin.y = center.y - bounds.size.height/2.0;
frame.size = bounds.size;
相对的,身为UIView下级结构的CALayer呢?
CALayer的position(相当于center),bounds,anchorPoint是什么关系呢?
虽然没有frame,但是CALayer的显示(虚拟frame)也是由这些组件算出来的
frame.origin.x = position.x - anchorPoint.x * bounds.size.width/2.0;
frame.origin.y = position.y - anchorPoint.y * bounds.size.height/2.0;
frame.size = bounds.size;
所以,当我们在上面修改anchorPoint的时候,实际上修改了显示的运算元素!这样当anchorPoint修改为(1.0,1.0)的时候,经过重新运算,CALayer向左上角移动了

相关博客:

http://www.cnblogs.com/benbenzhu/p/3615516.html?utm_source=tuicool

http://www.cnblogs.com/wendingding/p/3800736.html

http://blog.csdn.net/primer_programer/article/details/9904287

二、图层的几何变化

推荐看:http://www.cnblogs.com/liyufeng2013/p/3617083.html

图层一旦创建,你就可以通过矩阵变换来改变一个图层的几何形状。CATransform3D的数据结构定义一个同质的三维变化(4*4 CGFloat矩阵),用于旋转、缩放、歪斜和透视等。

你可以通过以下的任何一个方法改变CATransform3D的数据结构。

  • 使用CATransform3D函数。
  • 直接修改数据结构的成员,例如m34。
  • 使用键-值编码改变键的路径。

CATransform3DIdentity是单位矩阵,并不作任何变化,把该矩阵应用在图层上面,会把图层几何数形修改为默认值。

1.使用CATransform3D函数

使用变化函数可以在动画里面操作矩阵。

表 1  CATransform3D 变换函数 :偏移、旋转和缩放

Function

Use

CATransform3DMakeTranslation

Returns a transform that translates by ‘(tx, ty, tz)’. t’ = [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1].

CATransform3DTranslate

Translate ‘t’ by ‘(tx, ty, tz)’ and return the result: * t’ = translate(tx, ty, tz) * t.

CATransform3DMakeScale

Returns a transform that scales by `(sx, sy, sz)’: * t’ = [sx 0 0 0; 0 sy 0 0; 0 0 sz 0; 0 0 0 1].

CATransform3DScale

Scale ‘t’ by ‘(sx, sy, sz)’ and return the result: * t’ = scale(sx, sy, sz) * t.

CATransform3DMakeRotation

Returns a transform that rotates by ‘angle’ radians about the vector ‘(x, y, z)’. If the vector has length zero the identity transform is returned.

CATransform3DRotate

Rotate ‘t’ by ‘angle’ radians about the vector ‘(x, y, z)’ and return the result. t’ = rotation(angle, x, y, z) * t.

旋转的单位采用弧度(radians),而不是角度(degress)。以下两个函数,你可以在弧度和角度之间切换。

CGFloat DegreesToRadians(CGFloat degrees) {;};
CGFloat RadiansToDegrees(CGFloat radians) { / M_PI;};

CATransform3DInvert反转矩阵的转换函数。反转矩阵乘以逆矩阵的值,结果是原始值。

(还有,CGAffineTransform烧脑,以后再研究~~)

2.修改CATransform3D的数据结构

struct CATransform3D
{
  CGFloat m11, m12, m13, m14;
  CGFloat m21, m22, m23, m24;
  CGFloat m31, m32, m33, m34;
  CGFloat m41, m42, m43, m44;
};

typedef struct CATransform3D CATransform3D;

iOS - CALayer相关(CATransform3D)的更多相关文章

  1. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  2. iOS网络相关零散知识总结

    iOS网络相关零散知识总结 1. URL和HTTP知识 (1) URL的全称是Uniform Resource Locator(统一资源定位符). URL的基本格式 = 协议://主机地址/路径   ...

  3. iOS CALayer使用

    CALayer使用 iOS的设备中,我们之所以能看到各种各样的控件.文字.图片,都是Core Animation框架的功劳.它通过图层的合成,最终显示在屏幕上.而今天这篇文章讲的就是Core Anim ...

  4. iOS CALayer应用详解

    跟着大神一起进步,本篇博客原文地址:http://blog.csdn.net/hello_hwc?viewmode=contents 一 CALayer是什么? Layers是绘图和动画的基础,  L ...

  5. iOS - 直播相关文章

    直播相关文章 直播RTMP可用于测试的服务器地址 FFmpeg avdumpformat输出的tbn.tbc.tbr.PAR.DAR的含义 FFmpeg 3.0 计算视频时长 HLS Streamin ...

  6. IOS CALayer(二)

    UIview内部有个默认的CALayer对象层,虽然我门不可以重新创建它,但是我门可以再其上面添加子层. 我们知道,UIView有 addSubview:方法,同样,CALayer也有addSubla ...

  7. IOS CALayer(一)

    对于一个app的好坏,我们首要判断的便是app的界面,而界面的建立则是在图形的处理基础上的,说到图形处理又不得不提及Quartz2D,CALayer. 在iOS系统中,你能看得见摸得着的东西基本上都是 ...

  8. iPhone/iOS图片相关(读取、保存、绘制、其它相关)

    http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...

  9. iOS CALayer动画中使用的3个tree

    在网上经常看到关于layer的tree的描述,不太理解,今天找到了官方文档,原文在Core Animation Programming Guide 中. Layer Trees Reflect Dif ...

随机推荐

  1. Button、ImageButton及ImageView详解

    Button.ImageButton及ImageView详解 在应用程序开发过程中,很多时候需要将View的background或者src属性设置为图片,即美观又支持点击等操作.常见的有Button. ...

  2. Windows Phone 8 下载文件进度

    后台代码: public partial class MainPage : PhoneApplicationPage { private long siz; private long speed; p ...

  3. 【JavaScript】 JSON

    1.json 一共就这么几种数据类型   ①,number   和JavaScript的number完全一样   ②,boolean  就是JavaScript的true和false   ③,stri ...

  4. difference between append and appendTo

    if you need append some string to element and need set some attribute on these string at the same ti ...

  5. android第三方框架 xlistview 的使用

    如今上拉刷新,下拉加载更多已经是浩如烟海的app的标配了 最近正好有相关的需要就去学习了一下,还是那句老话凡事都靠自己来 搞实在不是一件好事,费时费力不说可能还是在做无用功,不过自己研究学习 还是很有 ...

  6. 十天冲刺---Day2

    站立式会议 站立式会议内容总结: git上Issues新增内容: 燃尽图 照片

  7. HIbernate的增删改

    数据库是oracle 以一对多为例:user50一的一方      order50是多的一方 首先是实体类: 这里的实体是双向关系,既通过user50可以找到order50,通过order50可以找到 ...

  8. 关于web前端的学习路线

    第一阶段: HTML+CSS:HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础:Js基础教程.js内置对象常用方法.常见DOM树操作大全.ECMAsc ...

  9. poj1655 树的重心 树形dp

    树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 处理处每个节点的孩子有几个,和树的大小就好了. #include< ...

  10. Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)

    接上篇<WebApi服务URI加密及验证的两种方式>,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的. 如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一 ...