一、图层的几何

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

图层几何的属性:

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. DSOFramer 之一:在 64 位系统注册 DSOFramer

    DSOFramer是微软提供的一款用于在线编辑.调用Word.Excel等Office程序的ActiveX组件.很多第三方的Office组件都是基于DSOFramer组件开发的.今天我们不讲如何使用D ...

  2. Android之Activity启动模式

    正常模式 每个应用都有一个任务栈,任务栈中保存着已创建的Activity,先创建的Activity先入栈,栈顶是当前正在显示的activity(running),这是正常模式下的Activity的管理 ...

  3. mysql创建触发器

    触发器语句只有一句话 可以省略begin和end CREATE trigger `do_praise` after insert on praise for each row update post ...

  4. hihocoder1241 Best Route in a Grid

    题目链接:hihocoder 1241 题意: n*n的格阵,每个方格内有一个数字.蚂蚁从左上角走到右下角,数字是零的方格不能走,只能向右向下走.蚂蚁走的路径上全部方格的的乘积为s,要使s低位0的个数 ...

  5. Mysql与Redis的同步实践

    一.测试环境在Ubuntu kylin 14.04 64bit 已经安装Mysql.Redis.php.lib_mysqludf_json.so.Gearman. 点击这里查看测试数据库及表参考 本文 ...

  6. RabbitMQ集群、镜像部署配置

    1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.Act ...

  7. 【原创】解决jquery在ie中不能解析字符串类型xml结构的xml字符串的问题

    $.fn.extend({ //此方法解决了ie中jquery不识别非xml的类型的xml字符串的问题 tony tan findX: function (name) { if (this & ...

  8. python基础_字典_列表_元组考试_day4

    1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=['alex','eric','rain'] li=['alex','eric','rain'] v="_".jo ...

  9. .net 使用memcache做缓存

    前段时间去一家公司面试,面试官问到我对缓存了解多少,因为我是做B/S开发的,所以把知道的都说了.比如:Application.Cache.页面缓存.文件缓存.然后面试官说“不止这些,还有呢?”,我后来 ...

  10. iOS开发-- 利用AVPlayer播放远程音乐和视频

    一.简单的播放音乐和视频,播放视频的工具栏需要自己写 二.利用老师封装的框架实现视频播放 链接:http://pan.baidu.com/s/1hrEKlus 密码:8e7g