iOS中的transform有兩種康谆,一種是UIView的CGAffineTransform牵触,另一種是CaLayer的CATransform3D
CGAffineTransform
繪制2D圖形的一個(gè)仿射變換矩陣冠桃。一個(gè)仿射變換矩陣用于做旋轉(zhuǎn)茵肃、縮放蒂萎、平移
- CGAffineTransform是UIView中的一個(gè)屬性
@property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity. animatable
typedef struct CGAffineTransform CGAffineTransform;
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
總結(jié)下transform的一些用法
- 按照比例進(jìn)行縮放
CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);
CGAffineTransformMakeScale(-1.0, 1.0); //水平翻轉(zhuǎn)
CGAffineTransformMakeScale(1.0,-1.0); //垂直翻轉(zhuǎn)
- 按照一定弧度旋轉(zhuǎn)
CGAffineTransformMakeRotation ( CGFloat angle);
- 平移的變化
CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);
- 修改CGAffineTransform同欠,在之前的變換基礎(chǔ)上做操作
CGAffineTransformTranslate
CGAffineTransformScale
CGAffineTransformRotate
CGAffineTransformInvert //返回Transformation的反向
CGAffineTransformConcat //合并兩個(gè)Transformation
- 還原到進(jìn)行變換之前的狀態(tài)
CGAffineTransformIdentity
- CGAffineTransformInvert 反向
CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);
CATransform3D
CATransform3D 主要是針對(duì)CALayer的3D旋轉(zhuǎn)
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;
//判斷一個(gè)transform3D的對(duì)象是否是最初的樣子
/* Returns true if 't' is the identity transform. */
bool CATransform3DIsIdentity (CATransform3D t);
//比較兩個(gè)transform3D對(duì)象是否等同
/* Returns true if 'a' is exactly equal to 'b'. */
bool CATransform3DEqualToTransform (CATransform3D a, CATransform3D b);
//將兩個(gè) transform3D對(duì)象變換屬性進(jìn)行疊加调煎,返回一個(gè)新的transform3D對(duì)象
/* 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)
//-----平移
//返回一個(gè)平移變換的transform3D對(duì)象 tx镜遣,ty,tz對(duì)應(yīng)x士袄,y悲关,z軸的平移
CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
//在某個(gè)transform3D變換的基礎(chǔ)上進(jìn)行平移變換谎僻,t是上一個(gè)transform3D,其他參數(shù)同上
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);
//-----縮放
//x寓辱,y艘绍,z分別對(duì)應(yīng)x軸,y軸秫筏,z軸的縮放比例
CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
//在一個(gè)transform3D變換的基礎(chǔ)上進(jìn)行縮放變換诱鞠,其他參數(shù)同上
CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz);
//-----旋轉(zhuǎn)
//angle參數(shù)是旋轉(zhuǎn)的角度 ,x跳昼,y般甲,z決定了旋轉(zhuǎn)圍繞的中軸,取值為-1 — 1之間鹅颊,如(1,0墓造,0),則是繞x軸旋轉(zhuǎn)堪伍,(0.5,0.5觅闽,0)帝雇,則是繞x軸與y軸中間45度為軸旋轉(zhuǎn)
CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
//在一個(gè)transform3D的基礎(chǔ)上進(jìn)行旋轉(zhuǎn)變換,其他參數(shù)如上
CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
- 常用使用方法
//CALayer的3D旋轉(zhuǎn)
CATransform3D turnTrans = CATransform3DMakeRotation(M_PI / 4, 0, 0, 1);
self.imageView.layer.transform = turnTrans;
- 平移蛉拙,縮放尸闸,旋轉(zhuǎn),我們也可以使用KVO來實(shí)現(xiàn)
//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軸旋轉(zhuǎn)
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.z"];
//沿著x軸旋轉(zhuǎn)
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.x"];
//沿著y軸旋轉(zhuǎn)
[self.imageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.y"];