CGAffineTransform此类是一个3*3矩阵的变换。

- (void)transformImageView

{

CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,

scale * previousScale);

t = CGAffineTransformRotate(t, rotation + previousRotation);

self.imageView.transform = t;

}

1、首先创建了一个变换CGAffineTransform的一个对象 t ,这个变换是用来放缩的,里面的两个参数分别是对宽和高放大或缩小的倍数,这里是以相同比例放缩的。

2、第二行句是在放缩变化中再加入角度的变换。‘

3、最后把变换赋给图片视图的一个属性transform。

就这么简单就实现了图片的旋转和放缩。

CGAffineTransform类的方法

一、创建一个Transformations

1、CGAffineTransformMake  //直接创建变换

CGAffineTransform CGAffineTransformMake (

CGFloat a,

CGFloat b,

CGFloat c,

CGFloat d,

CGFloat tx,

CGFloat ty );

可以看到参数比较多,其实它就是对应矩阵的前两列。据我估计,

可能一般不会直接用这个做变换。

2、CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);//创建一个给定比例放缩的变换

视图引用了这个变换,那么图片的宽度就会变为  width*sx  ,对应高度变为  hight * sy。

CGAffineTransformMakeScale(-1.0, 1.0);//水平翻转

CGAffineTransformMakeScale(1.0,-1.0);//垂直翻转

3、CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle); //创建一个旋转角度的变化

在这里可以看到参数并不是一个角度,但是它是把参数作为一个弧度,然后把弧度再转换为角度来处理,

其结果就可能是将一个图片视图旋转了多少度。

4、CGAffineTransformMakeTranslation  //创建一个平移的变化

CGAffineTransform CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);

这个就比较好理解了,假设是一个视图,那么它的起始位置 x 会加上tx , y 会加上 ty

二、修改Transformations

1、CGAffineTransformTranslate //为一个变换再加上平移

CGAffineTransform CGAffineTransformTranslate (

CGAffineTransform t,

CGFloat tx,

CGFloat ty

);

简单来说就是在变化 t 上在加上平移

2、CGAffineTransformScale  //为一个Transformation再加上缩放

CGAffineTransform CGAffineTransformScale (

CGAffineTransform t,

CGFloat sx,

CGFloat sy);

3、CGAffineTransformRotate  //为一个Transformation再加上旋转

CGAffineTransform CGAffineTransformRotate (

CGAffineTransform t,

CGFloat angle

);

4、CGAffineTransformInvert    //返回Transformation的反向

CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);

5、CGAffineTransformConcat  //合并两个Transformation

CGAffineTransform CGAffineTransformConcat (CGAffineTransform t1, CGAffineTransform t2);

返回一个由 t1 和  t2  合并而成的Transformation

三、运用Transformations

1、CGPointApplyAffineTransform  //把变化应用到一个点上

CGPoint CGPointApplyAffineTransform (

CGPoint point,

CGAffineTransform t );

这个方法的返回值还是一个CGPoint,在我看来由于是一个点,

这个方法最终也只会影响这个点所在的位置。

2、CGSizeApplyAffineTransform  //运用到一个区域中

CGSize CGSizeApplyAffineTransform (

CGSize size,

CGAffineTransform t);

只会改变区域的大小

3、CGRectApplyAffineTransform  //运用到一个带原点的区间

CGRect CGRectApplyAffineTransform (

CGRect rect,

CGAffineTransform t);

这个我亲自试验过,三个属性 放缩、旋转和平移都有的一个Transformation ,

但处理之后只会改变这个区域原点的位置,和宽、高的大小,并不会旋转

四、检测一个Transformation

1、CGAffineTransformIsIdentity //检测一个Transformation是不是恒等变换,也就是说不变

bool CGAffineTransformIsIdentity ( CGAffineTransform t);//其结果返回一个BOOL值

2、CGAffineTransformEqualToTransform  //检测两个Transformation是否相等。

bool CGAffineTransformEqualToTransform (

CGAffineTransform t1,

CGAffineTransform t2);

CGAffineTransform 缩放 / 旋转 / 平移的更多相关文章

  1. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  2. 使用C++实现图形的旋转、缩放、平移

    编译环境:VS2017 编译框架:MFC 实验内容:显示一个三角形,并将其绕中心进行旋转.缩放以及平移等操作 实验步骤: 1.打开VS2017,并创建MFC项目,具体方法参见:http://www.c ...

  3. 初学Direct X(7) ——位图的旋转,缩放以及平移

    初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...

  4. Three.js三维模型几何体旋转、缩放和平移

    创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...

  5. ARFoundation - 实现物体旋转, 平移,缩放

    ARFoundation - 实现物体旋转, 平移,缩放 本文目的是为了确定在移动端怎样通过单指滑动实现物体的旋转,双指实现平移和缩放. 前提知识: ARFoundation - touch poin ...

  6. 利用canvas制作图片(可缩放和平移)+相框+文字

    前言: 公司一个售前问我能不能用H5做一个手机拍照,给相片添加相框和添加文字上传到服务器的功能,我当时一琢磨觉得可行,就利用空余时间做了一个demo,去掉了拍照和上传,如果以后有机会,会给补上,当然对 ...

  7. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  8. WPF动态加载3D 放大-旋转-平移

    原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DW ...

  9. ios iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 转自容芳志大神的博客:http://www.cnblogs.com/stoic/archive/2013/02/27/2940 ...

随机推荐

  1. 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)

    传送门:Problem 1020 https://www.cnblogs.com/violet-acmer/p/9852294.html 讲解此题前,先谈谈何为最长上升子序列,以及求法: 一.相关概念 ...

  2. spring-data-jpa与mybatis的对比

    Spring Data JPA 与 MyBatis对比 Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现 ...

  3. Makefile ------ 在Makefile中进行宏定义-D

    在Makefile中我们可以通过宏定义来控制源程序的编译.只要在Makefile中的CFLAGS(变量名随意)中通过选项-D来指定你于定义的宏即可. 如:CFLAGS += -D _YUQIANG在编 ...

  4. 多行文本文本输入框 textarea 可点击任意地方编辑的问题

    遇到了一个问题: textarea可以点击任意地方编辑 原因: textarea中间我换行了 改成: 就正常了.

  5. 在Linux上安装Elasticsearch Head工具.md

    在Linux上安装Elasticsearch Head工具 1.修改elasticsearch的参数 编辑elasticsearch的配置文件elasticsearch.yml $ vim /data ...

  6. js对象之window和document区别

    window是整个页面的全局环境,而document可以理解为整个页面这个最大的元素(整个dom树) window: 可以看到window下面有很多变量 document: 可见document是整个 ...

  7. 纯js异步无刷新请求(只支持IE)【原】

    纯js异步无刷新请求 下载地址:http://pan.baidu.com/s/1slakL1F 所以因为非IE浏览器都禁止跨域请求,所以以只支持IE. <HTML> <!-- 乱码( ...

  8. Spring的单例实现原理-登记式单例

    单例模式有饿汉模式.懒汉模式.静态内部类.枚举等方式实现,但由于以上模式的构造方法是私有的,不可继承,Spring为实现单例类可继承,使用的是单例注册表的方式(登记式单例). 什么是单例注册表呢, 登 ...

  9. mysql 缓存机制

    了解mysql缓存吗(顺丰) mysql缓存机制就是缓存sql 文本及缓存结果,用KV形式保存再服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要在再去解析.优化.执行sql. ...

  10. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...