iOS - CALayer相关(CATransform3D)
一、图层的几何
图层的几何简单通俗,图层的所有几何属性(包括矩阵变换),都可以有隐式和显式动画。
图层几何的属性:

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 |
|
|
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]. |
|
|
Translate ‘t’ by ‘(tx, ty, tz)’ and return the result: * t’ = translate(tx, ty, tz) * t. |
|
|
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]. |
|
|
Scale ‘t’ by ‘(sx, sy, sz)’ and return the result: * t’ = scale(sx, sy, sz) * t. |
|
|
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. |
|
|
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)的更多相关文章
- iOS网络相关知识总结
iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...
- iOS网络相关零散知识总结
iOS网络相关零散知识总结 1. URL和HTTP知识 (1) URL的全称是Uniform Resource Locator(统一资源定位符). URL的基本格式 = 协议://主机地址/路径 ...
- iOS CALayer使用
CALayer使用 iOS的设备中,我们之所以能看到各种各样的控件.文字.图片,都是Core Animation框架的功劳.它通过图层的合成,最终显示在屏幕上.而今天这篇文章讲的就是Core Anim ...
- iOS CALayer应用详解
跟着大神一起进步,本篇博客原文地址:http://blog.csdn.net/hello_hwc?viewmode=contents 一 CALayer是什么? Layers是绘图和动画的基础, L ...
- iOS - 直播相关文章
直播相关文章 直播RTMP可用于测试的服务器地址 FFmpeg avdumpformat输出的tbn.tbc.tbr.PAR.DAR的含义 FFmpeg 3.0 计算视频时长 HLS Streamin ...
- IOS CALayer(二)
UIview内部有个默认的CALayer对象层,虽然我门不可以重新创建它,但是我门可以再其上面添加子层. 我们知道,UIView有 addSubview:方法,同样,CALayer也有addSubla ...
- IOS CALayer(一)
对于一个app的好坏,我们首要判断的便是app的界面,而界面的建立则是在图形的处理基础上的,说到图形处理又不得不提及Quartz2D,CALayer. 在iOS系统中,你能看得见摸得着的东西基本上都是 ...
- iPhone/iOS图片相关(读取、保存、绘制、其它相关)
http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...
- iOS CALayer动画中使用的3个tree
在网上经常看到关于layer的tree的描述,不太理解,今天找到了官方文档,原文在Core Animation Programming Guide 中. Layer Trees Reflect Dif ...
随机推荐
- Bootstrap系列 -- 9. 表格
一. Bootstrap 表格样式支持 Bootstrap提供了六种不同风格的样式支持,其中一个基础样式,4个附件样式,1个响应式设计样式 1. .table:基础表格 2. .table-strip ...
- 自己存档:ajax 动态提交form
$.ajax({ cache: true, type: "POST", ...
- nios II--实验7——数码管IP软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- Codeforces Round #358(div 2)
A:统计个数题,要注意ans+=a*b+c*d中,如果a*b>int,那么即使ans是long long也会越界,所以ans+=(long long)a*b+(long long)c*d B:模 ...
- name after, name for, name as
name after, name for, name as name after是一个常见用法 : 1.Her parents named her Sophia after her grandmo ...
- eclipse failed to load the jni jvm.dll
问题:打开Eclipse弹出,eclipse failed to load the jni jvm.dll,一般都是本机的JDK与Eclipse位数不等{32-64,64-32} 解决:看本机Java ...
- js日期显示效果
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
来源于:http://www.cnblogs.com/wangfg/p/5110831.html 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; s ...
- 修改placehosder
CSS美化INPUT placeholder效果.CSS代码美化文本框里的placeholder文字. ::selection伪元素 简而言之:单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3 ...
- mysql-存储过程案例-存储过程中创建表和修改表数据
-- 本存储过程有特殊执行循环数量的要求,是对security_market_history表进行修正 -- 判断存储过程是否存在 drop PROCEDURE if exists proc_secu ...