(转) Core Animation 简介
原文出处:(http://hi.baidu.com/zijian0428/blog/item/6085e5fe8ff987225d60083b.html) 1. 简介 2. 相关类 2.1 层(layrer) 2.2动画和时间类 3. 类层次图
第三章 层的坐标及转换
这章节主要描述层坐标的构成要素,构成要素之间的关系及如何转换产生复杂的效果。 1 层坐标系统 层 坐标使用了和Quanz图形一样的坐标系统。默认情况下,原点(0.0, 0.0)在左下角,向右及向上增长。请注意:该坐标系统是不同于UIView实例的坐标系统,UIView系统的原点在左上角,向右及向下增长。每个层的 实例都维护自己的坐标系统,定位所有的子层及绘图时都是相对于这个坐标系统。 2 层的几何坐标 层的几何坐标系统图: 2.1 Bounds 没有人不知道这东东,跳过。 2.2 Position CGPoint类型,指定了相对于父层(superlayer)的位置,由父层的坐标系统来表示。 2.3 Frame 改变层的frame时,层的position和bounds会相应的改变,但层并没有frame属性,它是由层的position, bounds, anchorPoint(参照点) 和transform计算而来。 2.4 Anchor point 参照点 今天的重点属性。一定要理解。该属性是在层的bounds范围内的一个点,值为0.0到1.0。所有的转换都是相对于这个点进行计算的。 下图是三个anchor point的值: 接下来,我们来看一下frame, bounds, position 及 anchorPoint之间的关系。 如下图: 在 这个图中,anchor point的默认值为(0.5,0.5),相当于层的中心。如果你设置frame为(40.0, 60.0, 120.0, 80.0),则position值会被自动设置为(100,100)。我们还可以看到旋转和缩放的转换计算都是相对于参照点进行的。 下图的frame的大小和图3是一样的,但是anchor point为(0.0,0.0): 2.5 cornerRadius 当要绘图,剪辑子层,画边框及阴影时,可以指定层所使用的半径大小以产生圆角效果。 3 层的几何坐标转换 上面讲了那么多,都是为这一小节坐铺垫的。 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; 可以将该结构体赋值给层的两个属性transform 或者sublayerTransform,就可以实现坐标转换。 你可以通过以下三个方法来创建和修改这个结构体: 1) 使用CATransform3D函数获取 2) 直接修改结构体数据成员 3) 使用键值编码和键路径(key paths) 3.1 转换函数 3.1.1 平移,缩放及旋转转换函数(以下如何进行坐标转换计算实在是看不懂,线性代数太滥了,真后悔当初没好好学,^&^。高手请指教): 示例: reflectionLayer.transform = CATransform3DMakeScale(1.0, -1.0, 1.0); 该函数使层的Y坐标反转,产生倒影效果。 论谈里有一个关于CATransform3DMakeScale矩阵转换的使用例子,大家可以看一下,对于理解矩阵转换还是很有帮助的,地址:http://www.cocoachina.com/macdev/ca/2009/0611/33.html 系统也提供了反转矩阵的函数CATransform3DInvert。 3.1.2 仿射转换函数: 3.1.3 测试是否是相等的函数: 3.2 使用键路径(key paths)修改转换函数 示例: myLayer.transform.rotation.x=0; [myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"]; |