CGAffineTransform
这个是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真正的数学行为:

可以用函数判断这个矩阵是不是一个 identiy matrix
bool CGAffineTransformIdentity(CGAffineTransform t);

CGAffineTransform的更多相关文章
- CGAffineTransform方法汇总
CGAffineTransform是二维的仿射变换,可以进行位移,旋转,缩放,CGAffineTransform实际上是一个矩阵. CGAffineTransform { CGFloat a, b, ...
- iOS方法类:CGAffineTransform的使用大概
CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...
- CGAffineTransform与CATransform3D
CGAffineTransform 1.CG的前缀告诉我们,CGAffineTransform类型属于Core Graphics框架,Core Graphics实际上是一个严格意义上的2D绘图API, ...
- iOS基础CGAffineTransform的简单使用
CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...
- CGAffineTransform相关函数
CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2); [xxx setTransform ...
- CoreGraphics 之CGAffineTransform仿射变换(3)
CoreGraphics 之CGAffineTransform仿射变换(3) CoreGraphics 的 仿射变换 可以用于 平移.旋转.缩放变换路径 或者图形上下文. (1)平移变换将路径或图 ...
- iOS方法类:CGAffineTransform的使用
CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...
- CGAffineTransform 放射变换解析 即矩阵变换
转载自;http://www.cocoachina.com/bbs/3g/read.php?tid=151136 矩阵乘法A B相乘要A的列数等于B的行数才有定义,结果是一个 A行B列的矩阵C,C的每 ...
- CGAffineTransform的使用
typedef struct CGAffineTransform CGAffineTransform; struct CGAffineTransform { CGFloat a, b, c, d; C ...
随机推荐
- Android开发 Error:The number of method references in a .dex file cannot exceed 64K.
在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把使用Java ...
- Python Pandas分组聚合
Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数. apply(),applymap()和map() apply()和applymap()是DataFrame ...
- ORB-SLAM(五)优化
ORB-SLAM作为单目SLAM,其精度很大程度上决定于帧与帧之间的位姿优化的是否准确.因此优化(optimization)在ORB-SLAM里面扮演了很重要的角色.这一小节探讨一下ORB-SLAM里 ...
- C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)
动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程 ...
- [信安presentation]Fight against GFW
Section1:加密 加密算法分为:对称加密算法.非对称加密算法.Hash 1.1对称加密算法 加密解密使用相同的密钥 eg:DES,AES,RC4,RC5,Triple DES 缺点:1.因为加密 ...
- java 方法
方法命名规范要求 类的命名规范:“全部单词的 首字母必须大写”.那么在定义方法的时候也是有命名规范要求的:“第 一个单词的首字母小写,之后每个单词的首字母大写”,那么这就是方法 的命名规范. 递归调用 ...
- BZOJ1013: [JSOI2008]球形空间产生器sphere
传送门 高斯消元练习. 模板: void Guass(){ int waited; up(i,1,N){ waited=i; up(j,i+1,N)if(fabs(M[j][i])>fabs(M ...
- iBatis.net 类的继承extends和懒加载
<resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...
- Matlab编程知识点
容易忘记的小知识点: Matlab程序首行程序: clear:close all:clc:程序运行开始最好清理下之前残留的各种数据,不然matlab可能会出错. clear(清理变量空间),close ...
- free-简单明了解释清楚怎么看内存使用
free命令可以用来查看系统内存使用情况.我一般习惯-m参数以MB的方式查看 [root@localhost ~]# free -m total used free shared buffers ca ...