想要通过变换Z轴来达到切换层级之后近大远小的效果,需要设置矩阵的m34值,首先来看看transform的结构:
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
其中m34就是用来设置layer的透视效果,也就是近大远小,需要和其他(x、y)轴的变动来结合看才能看出效果。
如果m34为0,则不形变,只是单纯的切换了显示层级。
m34值越大,透视效果越明显。
比如以下swift例子:
var t = CATransform3DIdentity
t.m34 = -(1 / 500)
t = CATransform3DTranslate(t, xDispNew, 0.0, zDispNew)
item.layer.transform = t;
其中需要注意的点是m34的值默认是CGFloat类型,所以这里swift能直接这么写,如果转换成OC,就会失效,因为在OC中-(1 / 500)
的值为0。
所以转为OC:
CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1.0/500.0;//注意类型
transform = CATransform3DTranslate(transform, xDistance, 0.0, zDistance);
item.layer.transform = transform;
今天把一个swift库翻译成OC时,这个点没注意,被坑了一会。。。