7.1 仿射变换
UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform的本质是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵。
检查是不是仿射变换,只需要看图层中任意两条平行线在变换之后还是不是平行,仍然平行就是仿射变换
UIView可以通过设置transform属性做变换,但实际上它只是封装了内部图层的变换。CALayer同样也有一个transform属性,但它的类型是CATransform3D,而不是CGAffineTransform,CALayer对应于UIView的transform属性叫做affineTransform
7.2 3D变换
和2x3的矩阵不同,CATransform3D是一个可以在3维空间内做变换的4x4的矩阵
透视投影
上面的3D变换在屏幕上看起来并不明显,这是因为我们视角到屏幕的距离一直是平行且不变的,而在现实中3D变换的时候物体的距离离我们视角的距离是会发生改变的,所以看起很明显。为了达到这种效果,我们需要引入投影变换(又称作z变换),也就是改变CATransform3D的m34(见上图,m34用于按比例缩放X和Y的值来计算到底要离视角多远),m34的默认值是0,我们可以通过设置m34为-1.0 / d来应用透视效果,d代表了想象中视角相机和屏幕之间的距离,以像素为单位,通常500-1000就够了
sublayerTransform属性
通过设置父图层的sublayerTransform,可以很方便的确保所有子图层的m34一致以及子图层的灭点都在容器图层的中点
背面
这并不是一个很好的特性,因为这有可能造成资源的浪费:既然永远都看不见这些图层的背面,那为什么浪费GPU来绘制它们呢?
CALayer有一个叫做doubleSided的属性来控制图层的背面是否要被绘制。这是一个BOOL类型,默认为YES,如果设置为NO,那么当图层正面从相机视角消失的时候,它将不会被绘制
扁平化图层
父图层会对子图层进行扁平化处理,意思就是说无论父图层做了什么变换,子图层一开始总是扁平化的
有一个例外,CATransformLayer不会扁平化图层(在专用图层章节有介绍)
7.3 固体对象(这一节的内容惊艳到我了)
本节创建了一个正方体,并有光亮和阴影效果(不过我跑起来没有该效果),以及某一面的点击事件
网友评论