iOS开发UIView的transform属性详解

本文主要是详解iOS开发UIView的transform属性

CGAffineTransform实际上是一个矩阵

| a,  b,  0 |

| c,  d,  0 |

| tx, ty, 1 |

a={1,1} b={1,2} c={2,1} d={2,2} tx={3,1} ty={3,2}

这个矩阵是用来标记这个View的变化,可以是旋转,缩放,平移。

也就是说,View的坐标为 {x,y},变化后的坐标是{x',y'}

.

         | a,  b,0|

{x',y',1}={x,y,1} x   | c,  d,0|

          | tx, ty,1|

transform是view的一个重要属性,它在矩阵层面上改变view的显状态,能实现view的缩放、旋转、平移等功能。transform是CGAffineTransform类型的。使用transform后view的frame被真实改变的。

struct CGAffineTransform {

CGFloat a, b, c, d;

CGFloat tx, ty;

};

transform详解

在view可以看做有很多像素块构成,可以用(x,y)代表一个像素块,x为宽,y为高。transform就是改变每个像素块的形状。在运算过程中,[x,y,1]表示原来的像素块,而新的像素块[xn,yn,1]是由[x,y,1]乘以矩阵

{

a, b, 0

c, d, 0

tx,ty,1

}

生成的。

化简矩阵相乘,公式为

xn=ax+cy+tx;

yn=bx+dy+ty;

这个矩阵的第三列是固定的,所以每次变换时,只需传入前两列的六个参数[a,b,c,d,tx,ty]即可。

在CGAffineTransform的生成函数中,大多是两两对应的,一个带make字样,一个没有。带make字样的是直接生成一个新的CGAffineTransform,没有make字样的则是在一个CGAffineTransform的基础上生成新的。

函数返回值均是CGAffineTransform类型。

//实现的是放大和缩小,在原来transform的基础上生成一个新的transform。生成新的transform相当于将t' = [sx,0,0,sy,0,0]这六个参数代入矩阵中。则矩阵为[

sx,0 ,0

0 ,sy,0

0 ,0 ,1

];代入公式中,xn=(sx)*x,yn=(sy)*y。所以sx,sy分别代表x轴与y轴上的放大倍数。

CGAffineTransformScale(CGAffineTransform t,CGFloat sx, CGFloat sy);

CGAffineTransformMakeScale(CGFloat sx, CGFloat sy);

//实现的是旋转。angle为角度,angle=π则旋转180度。矩阵的六个参数为t' = [ cos(angle),sin(angle),-sin(angle),cos(angle) 0,0];

CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

CGAffineTransformMakeRotation(CGFloat angle);

//实现的是平移,矩阵的六个参数为t' = [1,0,0,1,tx,ty] ;代入公式,xn=x+tx,yn=y+ty。

CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx, CGFloat ty);

CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty);

1//旋转

2- (IBAction)rotationButtonPressed:(id)sender

3{

4self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);

5}

6//缩放

7- (IBAction)scaleButtonPressed:(id)sender

8{

9self.imageView.transform = CGAffineTransformScale(self.imageView.transform, 0.9, 0.9);

10}

11

12- (IBAction)moveButtonPressed:(id)sender

13{

14_imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 10);

15}

•获得CGAffineTransform有多种方法,例如使用CGAffineTransformMake,但是对于矩阵操作相对比较麻烦,事实上iOS已经为我们准备好了三个方法:CGAffineTransformMakeRotation(旋转)、CGAffineTransformMakeScale(缩放)、CGAffineTransformMakeTranslation(移动);

• transform进行旋转、缩放、移动的时候不是在原来的基础上增量形变的,因此如果需要持续在原来的基础上旋转、缩放、移动那么每次需要在原来的基础上增加或减少。当然,我们可以定义一个全局变量进行累加,但是事实上iOS已经为我们提供好了三个对应的方法,分别用于在原来的角度、缩放、移动位置的基础上做出修改:CGAffineTransformRotate、CGAffineTransformScale、CGAffineTransformTranslate;

链接:http://www.jianshu.com/p/e6fba52aed4f

UIView的transform的更多相关文章

  1. UIView 的Transform属性以及 CGAffineTransform的使用

    什么是Transform? Transform是一个3×3的矩阵,如下图所示: 通过这个矩阵我们可以对一个坐标系统进行缩放,平移,旋转以及这两者的任意组着操作.而且矩阵的操作不具备交换律,即矩阵的操作 ...

  2. UIView的transform属性

    一.什么是Transform Transform(变化矩阵)是一种3×3的矩阵,如下图所示: 通过这个矩阵我们可以对一个坐标系统进行缩放,平移,旋转以及这两者的任意组着操作.而且矩阵的操作不具备交换律 ...

  3. UIView简单动画

    UIView动态实现的效果有以下几种: 1.动态改变frame 2.动态改变color 3.动态改变alpha 4.动态改变bounds 首先,我们先看几种BasicView动画 #pragma ma ...

  4. 2016 - 1- 14 UI阶段学习补充 transform属性详解

    UIView的transform属性 transform是view的一个重要属性,它在矩阵层面上改变view的显⽰状态,能实现view的缩放.旋转.平移等功能.transform是CGAffineTr ...

  5. UIView Programming Guide学习笔记

    |View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...

  6. iOS Transform坐标变化

    在使用CGContext时,由于Quartz 2D与UIKit坐标不一致,所以需要对context进行再一次的变化,达到预期的效果. 1. 不同坐标原点介绍 在Quartz 2D中,坐标原点在画布的左 ...

  7. iOS----应用的旋转---Orientations

    此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. QQ : 1101819159 邮箱: GeekiVan@aliyun. ...

  8. CGAffineTransform

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

  9. iOS开发知识点总结

    main文件做了这几件事: 1. 创建当前的应用程序 2. 根据4个参数的最后为应用程序设置代理类(默认情况下是AppDelegate) 3. 将appDelegate 和 应用程序 建立关联(指定代 ...

随机推荐

  1. 如何用Javascript检测到所有的IE版本

    如何用Javascript检测到所有的IE版本 function GetIEVersion() { var sAgent = window.navigator.userAgent; var Idx = ...

  2. 轻松解决vuejs跨域

    Vuejs跨域问题实战 有时候,本地使用webpack开启一个node的dev端口,项目中使用vuejs去访问别人家的api,比如豆瓣或者其他的api,不使用jsonp肯定就会报跨域的问题. 如何让我 ...

  3. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  4. OpenGL ES 3.0之Shading Language(八)

    每个OpenGL ES 3.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形.着色器概念是API 的中心,本篇将介绍着色器语言部分包含下面几项 1.变量和变量类型 2.矢量和矩阵创建及选择 3. ...

  5. FastDFS_v4.06+nginx-1.4.2配置详解

    径不带group名(storage只有一个group的情况),如/M00/00/00/xxx:       location /M00 {            ngx_fastdfs_module; ...

  6. 【Linux】好玩的Linux命令(二)

    关于Linux talk:http://man.linuxde.net/talk 下面文章转自:http://www.oschina.net/translate/11-lesser-known-use ...

  7. 再玩 DevStack(Mitaka版)- 基于 trystack.cn 源

    曾经就写过一篇关于DevStack安装OpenStack的文章< 使用 DevStack 高速部署 OpenStack 开发环境 >,时过境迁,如今有更好的方式来实现.想到曾经的复杂性,认 ...

  8. android形状drawable

    1.在res目录下新建drawable目录. 2.新建一个xml文件. 3.採用drawable来定义资源. <? xml version="1.0" encoding=&q ...

  9. BFC特性 形成BFC

    1.示例代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  10. 在Ubuntu上安装pyenv 相关问题Common build problems

    Requirements: Ubuntu/Debian: sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libb ...