iOS中的transform有两种,一种是UIView的CGAffineTransform,另一种是CaLayer的CATransform3D
CGAffineTransform
绘制2D图形的一个仿射变换矩阵。一个仿射变换矩阵用于做旋转、缩放、平移
- CGAffineTransform是UIView中的一个属性
@property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity. animatable
typedef struct CGAffineTransform CGAffineTransform;
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
总结下transform的一些用法
- 按照比例进行缩放
CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);
CGAffineTransformMakeScale(-1.0, 1.0); //水平翻转
CGAffineTransformMakeScale(1.0,-1.0); //垂直翻转
- 按照一定弧度旋转
CGAffineTransformMakeRotation ( CGFloat angle);
- 平移的变化
CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);
- 修改CGAffineTransform,在之前的变换基础上做操作
CGAffineTransformTranslate
CGAffineTransformScale
CGAffineTransformRotate
CGAffineTransformInvert //返回Transformation的反向
CGAffineTransformConcat //合并两个Transformation
- 还原到进行变换之前的状态
CGAffineTransformIdentity
- CGAffineTransformInvert 反向
CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);
CATransform3D
CATransform3D 主要是针对CALayer的3D旋转
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中的一些API
//没有变化,最初的样子
/* The identity transform: [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]. */
const CATransform3D CATransform3DIdentity;
//判断一个transform3D的对象是否是最初的样子
/* Returns true if 't' is the identity transform. */
bool CATransform3DIsIdentity (CATransform3D t);
//比较两个transform3D对象是否等同
/* Returns true if 'a' is exactly equal to 'b'. */
bool CATransform3DEqualToTransform (CATransform3D a, CATransform3D b);
//将两个 transform3D对象变换属性进行叠加,返回一个新的transform3D对象
/* Concatenate 'b' to 'a' and return the result: t' = a * b. */
CATransform3D CATransform3DConcat (CATransform3D a, CATransform3D b);
//类似CGAffineTransform 中的CGAffineTransformInvert 代表 反向变换
/* Invert 't' and return the result. Returns the original matrix if 't'
* has no inverse. */
CA_EXTERN CATransform3D CATransform3DInvert (CATransform3D t)
//-----平移
//返回一个平移变换的transform3D对象 tx,ty,tz对应x,y,z轴的平移
CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
//在某个transform3D变换的基础上进行平移变换,t是上一个transform3D,其他参数同上
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);
//-----缩放
//x,y,z分别对应x轴,y轴,z轴的缩放比例
CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
//在一个transform3D变换的基础上进行缩放变换,其他参数同上
CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz);
//-----旋转
//angle参数是旋转的角度 ,x,y,z决定了旋转围绕的中轴,取值为-1 — 1之间,如(1,0,0),则是绕x轴旋转,(0.5,0.5,0),则是绕x轴与y轴中间45度为轴旋转
CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
//在一个transform3D的基础上进行旋转变换,其他参数如上
CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
- 常用使用方法
//CALayer的3D旋转
CATransform3D turnTrans = CATransform3DMakeRotation(M_PI / 4, 0, 0, 1);
self.imageView.layer.transform = turnTrans;
- 平移,缩放,旋转,我们也可以使用KVO来实现
//x轴方向平移
[self.imageView.layer setValue:@(100) forKeyPath:@"transform.translation.x"];
//y轴方向平移
[self.imageView.layer setValue:@(100) forKeyPath:@"transform.translation.y"];
//沿着z方向平移
[self.imageView.layer setValue:@(100) forKeyPath:@"transform.translation.z"];
//沿着z轴旋转
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.z"];
//沿着x轴旋转
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.x"];
//沿着y轴旋转
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.y"];