一、图层的几何

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

图层几何的属性:

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. 自然数从1到n之间,有多少个数字含有1

        问题明确而简单.for循环肯定是不好的.       用递推方法:       定义h(n)=从1到9999.....9999  ( n 个 9)之间含有1的数字的个数.定义f(n)为n位数中 ...

  2. windows 内部预览版与迅雷极速版不配合

    为了体验bash on ubuntu安装的预览版本,结果原来的迅雷极速版本无法成功下载文件,总是在最后一刻报错退出. 解决方法是: 下载安装迅雷9 哈哈哈哈,新版迅雷挺不错的,运行良好. ctrl^v ...

  3. php 实现创建文件并追加数据

    最近因为后台有其他事情忙,所以我最近又开始学习php的内容了. (不过话说回来从客户端写到后台的感觉还是很爽的,嘿嘿) 需求是这样:从前台发来一些信息,存成文本文档,以后再统一处理(比如,存入用户账户 ...

  4. Mod4-PHP编码规范

    loading... 归纳总结了能找到的一些编码规范,形成自己所需要的编码规范. 参考网址:1.2 一.文件格式 缩进使用四个空格,不使用制表符.左花括号不另起一行. if (1 == $x) { $ ...

  5. my-Life项目开发流程

    一:新建java web项目  (懂得使用gradle哦!) 1.http://www.cnblogs.com/xylle/p/5234380.html 2.新建项目后,然后新建module, 如果甲 ...

  6. fio 2种画图方法 fio_generate_plots 和 gfio

    fio 安装fio apt-get install fio 可以把fio的输出数据自动画图的插件gnuplot apt-get install gnuplot 1.输出bw,lat和iops数据并画图 ...

  7. win7命令行 端口占用 查询进程号 杀进程

    打开CMD窗口 win+R–>cmd 根据端口号查找进程号 netstat -nao|grep 端口号 根据进程号得到进程名 tasklist |findstr 进程号 杀进程 taskkill ...

  8. mysql-异常Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1

    这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 网上摘抄的问题解决方案:http:// ...

  9. 轻快的VIM(三):删除

    这一节我们来看看删除,删除命令比较简单,不过要使删除更有效率 你需要配合我们第一节中讲的各种移动命令 字符删除 x 删除光标所在处字符 X 删除光标所在前字符 这里没有什么可注意的地方,但需要说明一下 ...

  10. C#微信开发之旅(二):基础类之HttpClientHelper(更新:SSL安全策略)

    public class HttpClientHelper   2     {   3         /// <summary>   4         /// get请求   5    ...