1、CATransform3D简介
layer有个属性transform,是CATransform3D类型。可以使其在三维界面作平移、缩放和旋转单独或组合动画!
CATransform3D结构体:
/* Homogeneous three-dimensional transforms.m11:控制x方向上的缩放m41:控制x方向上的平移m22:控制y方向上的缩放m42:控制y方向上的平移 m33:控制z方向上的缩放m43:控制z方向上的平移 m21、m31、m12、m32、m13、m23控制旋转 m21:和m12一起决定z轴的旋转 m31:和m13一起决定y轴的旋转 m32:和m23一起决定x轴的旋转 m14、m24、m34、m44m34为透视效果,要操作的这个对象要有旋转的角度,否则没有效果*/struct CATransform3D{ CGFloat m11, m12, m13, m14; CGFloat m21, m22, m23, m24; CGFloat m31, m32, m33, m34; CGFloat m41, m42, m43, m44;};
2、CATransform3D的简单使用和代码展示
2.1、平移
#pragma mark---平移/* 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]. 平移 tx,ty,tz对象x,y和z轴*/CA_EXTERN CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);/* Translate 't' by '(tx, ty, tz)' and return the result: * t' = translate(tx, ty, tz) * t. 在t变换的基础上 进行平移*/CA_EXTERN CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
- (void)transform3D{ CATransform3D transA = CATransform3DIdentity; transA = CATransform3DMakeTranslation(50, 50, 0); [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform = transA; } completion:^(BOOL finished) { [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform = CATransform3DTranslate(transA, -50, -50, 0); } completion:^(BOOL finished) { bgImageView.layer.transform = CATransform3DIdentity; }]; }];}
2.2、缩放
#pragma mark---缩放/* 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]. 缩放tx,ty,tz对象x,y和z轴缩放比例*/CA_EXTERN CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);/* Scale 't' by '(sx, sy, sz)' and return the result: * t' = scale(sx, sy, sz) * t. 在t变换的基础上 进行缩放*/CA_EXTERN CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
- (void)transform3DScale{// 1、缩放时先设置初始状态CATransform3DMakeScale(1, 1, 0);// 2、使用CATransform3DScale时,连续缩小或放大(不能缩放后放大、放大后缩小)// 3、直接使用CATransform3DMakeScale可以随意设置 CATransform3D transA = CATransform3DIdentity; transA = CATransform3DMakeScale(0.5, 0.5, 0); bgImageView.layer.transform = CATransform3DMakeScale(1, 1, 0); [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform =transA; } completion:^(BOOL finished) { [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform = CATransform3DScale(transA, 0.5, 0.5, 0); } completion:^(BOOL finished) { bgImageView.layer.transform = CATransform3DIdentity; }]; }];}
2.3、旋转
#pragma mark---旋转/* 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. 旋转 angle参数是旋转的角度 x,y,z决定了旋转围绕的中轴,取值为-1 — 1之间, 如(1,0,0),则是绕x轴旋转,(0.5,0.5,0),则是绕x轴与y轴中间45度为轴旋转*/CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);/* Rotate 't' by 'angle' radians about the vector '(x, y, z)' and return * the result. If the vector has zero length the behavior is undefined: * t' = rotation(angle, x, y, z) * t. 在t变换的基础上 进行旋转*/CA_EXTERN CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
- (void)transform3DRotation{// 1、m34实际上影响了z轴方向的translation,m34= -1/D, 默认值是0,我们需要尽可能的让m34这个值尽可能小 CATransform3D transA = CATransform3DIdentity; transA.m34 = - 1.0 / 600; transA = CATransform3DMakeRotation(M_PI_4, 1, 1, 0); [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform = transA; } completion:^(BOOL finished) { [UIView animateWithDuration:1 animations:^{ bgImageView.layer.transform = CATransform3DRotate(transA, -M_PI_4, -1, 1, 0); } completion:^(BOOL finished) { bgImageView.layer.transform = CATransform3DIdentity; }]; }];}
3、CATransform3D的其它方法说明
/* The identity transform: [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]. 最初的对象*/CA_EXTERN const CATransform3D CATransform3DIdentityCA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);/* Returns true if 't' is the identity transform. 判断t是否是最初的对象*/CA_EXTERN bool CATransform3DIsIdentity (CATransform3D t)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);/* Returns true if 'a' is exactly equal to 'b'. 判断a和b是否相同*/CA_EXTERN bool CATransform3DEqualToTransform (CATransform3D a, CATransform3D b)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);#pragma mark---other/* Concatenate 'b' to 'a' and return the result: t' = a * b. a和b进行叠加 返回新的对象*/CA_EXTERN CATransform3D CATransform3DConcat (CATransform3D a, CATransform3D b)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);/* Invert 't' and return the result. Returns the original matrix if 't' * has no inverse. 反向变换*/CA_EXTERN CATransform3D CATransform3DInvert (CATransform3D t)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);#pragma mark--- 3D和2D转换/* Return a transform with the same effect as affine transform 'm'. 将CGAffineTransform转化为CATransform3D*/CA_EXTERN CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);/* Returns true if 't' can be represented exactly by an affine transform. 判断一个CATransform3D是否可以转换为CGAffineTransform*/CA_EXTERN bool CATransform3DIsAffine (CATransform3D t)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);/* Returns the affine transform represented by 't'. If 't' can not be * represented exactly by an affine transform the returned value is * undefined. 将CATransform3D转换为CGAffineTransform*/CA_EXTERN CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t)CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);