我们先来看下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;
可以看到CATransform3D是一个4 * 4结构体, 另外它还有一个弟弟CGAffineTransform是 3 * 3结构体
他们的区别看名字就很明显,
CATransform3D是做3D坐标变换, 经常适用于CALayer
CGAffineTransform是做2D坐标变换, 经常适用于UIView
CATransform3D这个结构体中, 我们使用最多的是m34 后面我们再来说这个, 先知道就好了
我们继续看下CATransform3D头文件中的其他内容
CA_EXTERN const CATransform3D CATransform3DIdentity;
//一个无任何变换的默认矩阵常量,可用于使变换后的Layer恢复初始状态
CA_EXTERN bool CATransform3DIsIdentity (CATransform3D t);
//判断是否为默认矩阵
CA_EXTERN bool CATransform3DEqualToTransform (CATransform3D a,
CATransform3D b);
//判断两个矩阵是否相同
CA_EXTERN CATransform3D CATransform3DMakeTranslation (CGFloat tx,
CGFloat ty, CGFloat tz);
//生成一个依照参数平移转换后的矩阵
CA_EXTERN CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy,
CGFloat sz);
//生成一个依照参数缩放后的CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);//生成一个依照参数旋转后的矩
我们先看一个简单的例子, 实现一个矩形向内翻转
上代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//创建CALayer
CALayer * staticLayerA = [CALayer layer];
staticLayerA.bounds = CGRectMake(0, 0, 100, 100);
staticLayerA.position = self.view.center;
staticLayerA.backgroundColor = [UIColor redColor].CGColor;
//添加到主界面
[self.view.layer addSublayer:staticLayerA];
//创建CATransform3D默认变换矩阵
CATransform3D transA = CATransform3DIdentity;
//调整m34, 向里偏500个单位
transA.m34 = - 1.0 / 500;
//设置沿x轴偏转60度
transA = CATransform3DRotate(transA, M_PI / 3, 1, 0, 0);
//设置Layer3D偏转
staticLayerA.transform = transA;
}
代码里M34 = - 1.0 / 500 的意思就是图层距离屏幕向里500的单位
。如果向外则是M34 = 1.0 / 500。这个距离至一般掌握至500~1000这个范围会取得不错的效果。
这里需要注意的是M34的赋值一定要写在矩阵变换前面
可以再用BasicAnimation来实现3D动画, 用关键字: Transform
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.duration = 2;
animation.repeatCount = 100;
animation.autoreverses = YES;
animation.toValue = [NSValue valueWithCATransform3D:transA];
[staticLayerA addAnimation:animation forKey:nil];
大家可以试试看效果