CGAffineTransform

时间:2022-03-09 03:56:01

这个是CoreGraphics框架中的CGAffineTransform类,可用于设定UIView的transform属性。控制视图的缩放、旋转和平移操作。另称仿射变换矩阵。

Quartz转换实现原理:Quartz把绘图分为两个部分,用户空间(和设备无关),设备空间。用户空间和设备空间中存在一个转换矩阵CTM。我们可以通过直接修改CTM来实现效果,也可以通过创建Affine Transforms,然后连接CTM实现同样的效果。好处是可以重用Affine Transforms。

void CGContextContactCTM (CGContextRef c, CGAffineTransform transform);

1 CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty) 平移:设置平移量

CGContextTranslateCTM (myContext, 100, 50);//直接通过修改当前CTM实现

2 CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 缩放:设置缩放比例,仅通过设置缩放比例就可以实现视图扑面而来和锁紧屏幕的效果。

CGContextScaleCTM (myContext, .5, .75);//直接通过修改当前CTM实现

缩放,x*0.5 y*0.75

3 CGAffineTransformMakeRotation(CGFloat angle) 旋转:设置旋转角度

CGContextRotateCTM (myContext, radians(–45.));//直接通过修改当前CTM实现

以上三个都是针对视图的原定最初位置的中心点为起始参照进行相应操作的,在操作结束之后可对设置进行还原。

view.transform = CGAffineTransformIdentity;//线性代数里面讲的矩阵变换,这个是恒等变换,当改变过一个view.transform属性或者view.layer.transform的时候需要恢复默认状态的话,记得先把他们重置可以使用。或者view.layer.tranform = CATransform3DIdentity.

注意:如果一直不断改变一个view.transform的属性,而每次改变之前没有重置的话,会发现后来的改变和你想要的发生变化了,不是你真正想要的结果。

另外还可以通过CGAffineTransformTranslate等方法对现有的transform进行进一步处理。

使用:

#import "CoreGraphics.h"

CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);

[XXX setTransform:rotation];

//同CGAffineTransformRotate(transform, M_PI_2);

#define M_E         2.71828182845904523536028747135266250   e


#define M_LOG2E     1.44269504088896340735992468100189214   log 2e


#define M_LOG10E    0.434294481903251827651128918916605082  log 10e


#define M_LN2       0.693147180559945309417232121458176568  log e2


#define M_LN10      2.30258509299404568401799145468436421   log e10


#define M_PI        3.14159265358979323846264338327950288   pi


#define M_PI_2      1.57079632679489661923132169163975144   pi/2


#define M_PI_4      0.785398163397448309615660845819875721  pi/4


#define M_1_PI      0.318309886183790671537767526745028724  1/pi


#define M_2_PI      0.636619772367581343075535053490057448  2/pi


#define M_2_SQRTPI  1.12837916709551257389615890312154517   2/sqrt(pi)


#define M_SQRT2     1.41421356237309504880168872420969808   sqrt(2)


#define M_SQRT1_2   0.707106781186547524400844362104849039  1/sqrt(2)

 

4 反转效果 CGAffineTransformInvert(CGAffineTransform t);

5 只对局部产生效果 CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t);

6 判断两个仿射变换是否相等 CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2);

7 获取仿射变换 CGContextGetUserSpaceToDeviceSpaceTransform(CGContextRef c);

下面的函数只起到查看的效果,比如看一下这个用户空间的点,转换到设备空间去坐标是多少
CGPoint CGContextConvertPointToDeviceSpace (
   CGContextRef c,
   CGPoint point
);
 
CGPoint CGContextConvertPointToUserSpace (
   CGContextRef c,
   CGPoint point
);
 
CGSize CGContextConvertSizeToDeviceSpace (
   CGContextRef c,
   CGSize size
);
 
CGSize CGContextConvertSizeToUserSpace (
   CGContextRef c,
   CGSize size
);
 
CGRect CGContextConvertRectToDeviceSpace (
   CGContextRef c,
   CGRect rect
);
 
CGRect CGContextConvertRectToUserSpace (
   CGContextRef c,
   CGRect rect
);
 原文 http://donbe.blog.163.com/blog/static/138048021201061054243442/

CTM真正的数学行为:

CGAffineTransform

可以用函数判断这个矩阵是不是一个 identiy matrix

bool CGAffineTransformIdentity(CGAffineTransform t);

CGAffineTransform