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 ...
随机推荐
- logback 常用配置详解<appender>
logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的 ...
- ajax 多级联动 下拉框 Demo
写了ajax实现级联下拉框,考虑常用,并且级联个数随不同业务个数不同,于是就整理了一下,实现了 ajax + N级联动 下拉框的效果 效果图 HTML 代码 <h2> 省级联动</h ...
- PHP学习总结
<?php /* PHP简介: PHP是什么:PHP是一种创建动态交互性站点的强有力的服务器端脚步语言 PHP代表Hypertext Preprocessor PHP是一种使用广泛的开源的脚本语 ...
- Android Studio中的CmakeList NDK配置
Android Studio2.2之后直接可以在创建工程时添加NDK支持了,添加之后,main文件夹下会多出一个native-lib.cpp这个文件,如果只为了一个简单的NDK接口,貌似这就结束了.直 ...
- SSH框架的简单上传功能的实现
1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...
- jquery $.extend()扩展插件获取焦点或失去焦点事件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 查询SqlServer中每张表的记录数
select schema_name(t.schema_id) as [ Schema ], t. name as TableName,i. rows as [RowCount] from sys.t ...
- jsp上传图片实时显示
jsp代码 <div class="form-group" id="caseIma"> <label class="control- ...
- mybatis-generator 1.3.5支持流式 fluent 方法
在以往的无数此写model的过程中,大家都会烦恼model的set方法写一堆.比如 Person p = new Person(); p.setName("name"); p.se ...
- django文件上传和序列化
django实现文件上传 使用form表单上传文件 html页面 <html lang="en"> <head> <meta charset=&quo ...