??‍? Github Demo

方便记忆:

  • 本质:处理形变的类,通过"仿射变换矩阵"对控件的平移、缩放、旋转
  • 方法:
    • CGAffineTransformMakeTranslation:以初始位置为基准,在x轴方向上平移x单位,在y轴方向上平移y单位
    • CGAffineTransformMakeScale:以初始位置为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍
    • CGAffineTransformMakeRotation:以初始位置为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)
    • CGAffineTransformTranslate:以一个已经存在的形变为基准,在x轴方向上平移x单位,在y轴方向上平移y单位
    • CGAffineTransformScale:以一个已经存在的形变为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍
    • CGAffineTransformRotate:以一个已经存在的形变为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)
    • CGAffineTransformIdentity:transform属性默认值为CGAffineTransformIdentity,可以在形变之后设置该值以还原到最初状态

概述

A structure for holding an affine transformation matrix.

CGAffineTransform 是一个用于处理形变的类,其可以改变控件的平移、缩放、旋转等,其坐标系统采用的是二维坐标系,即向右为x轴正方向,向下为y轴正方向。

这个矩阵和坐标之间的关系如下:

struct CGAffineTransform { CGFloat a; CGFloat b; CGFloat c; CGFloat d; CGFloat tx; CGFloat ty; };
typedef struct CGAffineTransform CGAffineTransform;
复制代码

我们通过 UIImageView 的 transform 方法演示这一特性,注意默认情况下 UIImageView 的 User Interaction 为不可交互状态,需要设置一下:


方法介绍

  • CGAffineTransformMakeTranslation

CGAffineTransformMakeTranslation 实现以初始位置为基准,在x轴方向上平移x单位,在y轴方向上平移y单位。

CGAffineTransform transform = CGAffineTransformMakeTranslation(-100, 150);
imageView.transform = transform;
复制代码
  • CGAffineTransformMakeScale

CGAffineTransformMakeScale 实现以初始位置为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍

CGAffineTransform transform = CGAffineTransformMakeScale(2, 2);
imageView.transform = transform;
复制代码
  • CGAffineTransformMakeRotation

CGAffineTransformMakeRotation 实现以初始位置为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)

CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI);
imageView.transform = transform;
复制代码
  • CGAffineTransformTranslate

CGAffineTransformTranslate 实现以一个已经存在的形变为基准,在x轴方向上平移x单位,在y轴方向上平移y单位

CGAffineTransform transform = CGAffineTransformMakeTranslation(50, 50);
imageView.transform = CGAffineTransformTranslate(transform, 50, 50);
复制代码
  • CGAffineTransformScale

CGAffineTransformScale 实现以一个已经存在的形变为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍

CGAffineTransform transform = CGAffineTransformMakeScale(2, 0.5);
imageView.transform = CGAffineTransformScale(transform, 2, 1);
复制代码
  • CGAffineTransformRotate

CGAffineTransformRotate 实现以一个已经存在的形变为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)

CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI*0.25);
imageView.transform = CGAffineTransformRotate(transform, M_PI*0.25);
复制代码
  • CGAffineTransformIdentity

transform属性默认值为CGAffineTransformIdentity,可以在形变之后设置该值以还原到最初状态

imageView.transform = CGAffineTransformIdentity;
复制代码

CGAffineTransform原理

CGAffineTransform形变是通过"仿射变换矩阵"来控制的

  • 平移是矩阵相加
  • 旋转与缩放则是矩阵相乘

为了合并矩阵运算中的加法和乘法,引入了齐次坐标的概念。

齐次坐标提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法.

CGAffineTransform形变就是把二维形变使用一个三维矩阵来表示,其中第三列总是(0,0,1),形变通过前两列来控制,系统提供了CGAffineTransformMake结构体来控制形变。

CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
复制代码

三维变换矩阵如下

变换矩阵左乘向量,将空间中的一个点集从一个坐标系变换到另一个坐标系中,计算方式如下

计算结果

由上可知:

  • tx用来控制在x轴方向上的平移
  • ty用来控制在y轴方向上的平移
  • a用来控制在x轴方向上的缩放
  • d用来控制在y轴方向上的缩放
  • abcd共同控制旋转

对应的代码实现:

1)平移CGAffineTransformMakeTranslation原理

self.demoImageView.transform = CGAffineTransformMakeTranslation(100, 100);
self.demoImageView.transform = CGAffineTransformMake(1, 0, 0, 1, 100, 100);
复制代码

2)缩放CGAffineTransformMakeScale原理

self.demoImageView.transform = CGAffineTransformMakeScale(2, 0.5);
self.demoImageView.transform = CGAffineTransformMake(2, 0, 0, 0.5, 0, 0);
复制代码

3)旋转CGAffineTransformMakeRotation原理

self.demoImageView.transform = CGAffineTransformMakeRotation(M_PI*0.5);
self.demoImageView.transform = CGAffineTransformMake(cos(M_PI * 0.5), sin(M_PI * 0.5), -sin(M_PI * 0.5), cos(M_PI * 0.5), 0, 0);
复制代码

4)初始状态CGAffineTransformIdentity原理

self.demoImageView.transform = CGAffineTransformIdentity;
self.demoImageView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
复制代码

以上文章整理自:https://www.jianshu.com/p/ca7f9bc62429

iOS Principle:CGAffineTransform相关推荐

  1. iOS方法类:CGAffineTransform

    iOS方法类:CGAffineTransform的使用大概 CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平 ...

  2. iOS夯实:内存管理

    最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual reta ...

  3. iOS形变之CGAffineTransform

    今天有一个UILabel旋转90度的需求 了解到一篇文章 转载: iOS形变之CGAffineTransform - 简书CGAffineTransform介绍 概述 CGAffineTransfor ...

  4. iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据

    iOS开发:沙盒机制以及利用沙盒存储字符串.数组.字典等数据 1.初识沙盒:(1).存储在内存中的数据,程序关闭,内存释放,数据就会丢失,这种数据是临时的.要想数据永久保存,将数据保存成文件,存储到程 ...

  5. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  6. design principle:java 回调与委派/委托机制

    博客 design principle:模拟 android Button 控件点击事件   主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现. 委派, ...

  7. FFmpeg for ios架构:中级

    FFmpeg这部分想了非常久,也没找到比較好的解说方式.本来想像其他博客一样.对着代码一行行的分析.但后来感觉不太现实,FFmpeg应用在IOS上怎么说代码最少也有个5.6k行(包含音视频.业务逻辑) ...

  8. 玩转iOS开发:NSURLSession讲解(三)

    文章分享至我的个人技术博客: https://cainluo.github.io/14986211698053.html 前言 虽然前面两讲都是说了NSURLSession的一些理论上的知识, 但我们 ...

  9. 关东升的iOS实战系列图书 《iOS实战:传感器卷(Swift版)》已经上市

     承蒙广大读者的厚爱我的 <iOS实战:传感器卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11760248.html 欢迎关注关东升 ...

最新文章

  1. tensorflow 学习:用CNN进行图像分类
  2. 【Android 应用开发】Canvas 精准绘制文字 ( 测量文本真实边界 | 将文本中心点与给定中心点对齐 )
  3. 用python做自己主动化測试--绘制系统性能趋势图和科学计算
  4. python:直接插入和简单选择排序
  5. python容器数据类型_python collections 容器数据类型
  6. Flatten Binary Tree to Linked List - LeetCode
  7. 【Shell脚本】TDS离线备份还原
  8. CentOS 6.5 Nginx 配置
  9. [Android]Gradle 插件 DiscardFilePlugin(class注入清空类和方法)
  10. win10壁纸不能幻灯片放映_如何设置Win10桌面壁纸幻灯片放映? 设置Win10桌面壁纸幻灯片放映的方法...
  11. PCB绘图要点QA汇总
  12. 人工智能自然语言处理技术处理专业领域的运用
  13. Flink1.13 DataStream API - Event Time - Generating Watermarks
  14. 宝塔自动备份网站到FTP空间
  15. 使用GnuRadio + OpenLTE + SDR 搭建4G LTE 基站(上)
  16. 双十一特辑:Python采集商品数据,实时了解商品价格
  17. 陀螺仪与磁力计的姿态融合——互补滤波(续)
  18. Mentor PADS铺铜指示器的关闭操作
  19. 走近棒球运动·亚洲职棒大赛·MLB棒球创造营
  20. TZOJ 7034: 竹取飞翔 ~ Lunatic Princess 并查集+数学。

热门文章

  1. springboot开启debug日志_Spring Boot SLF4J日志实例(五十)
  2. [mmc subsystem] mmc core(第一章)——概述
  3. 怎么屏蔽搜索蜘蛛爬虫的ip段
  4. 《机器视觉表面缺陷检测综述》论文解读
  5. 安卓开发学习日记第四天番外篇_用Kotlin炒冷饭——越炒越小_莫韵乐的欢乐笔记
  6. 借助Facebook、Twitter等社交平台API打造的炫酷应用
  7. aptio设置图解教程2012中文_u盘装系统bios设置图解|u盘重装系统设置bios教程
  8. 如何使用ABBYY软件校正不能完全识别的表格
  9. Cloudera Manager大数据管理平台介绍
  10. 国际人工智能泰斗—迈克尔·乔丹