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. java 上传图片压缩图片

    package com.bitspace.flame.util; import java.io.File; import java.awt.Image;import java.awt.image.Bu ...

  2. [Algorithm] Delete a node from Binary Search Tree

    The solution for the problem can be divided into three cases: case 1: if the delete node is leaf nod ...

  3. Android 多屏适配解决方式

    1.主流手机必要測量的參数(通过详细的方法.測量出,须要測试手机的 以下的这些參数,我们主要使用的仅仅是 screenwidth  这个參数,其它參数仅仅是帮助我们更好的理解 屏幕适配) Displa ...

  4. linux 常用命令--------雪松整理

    linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...

  5. ckeditor 4.2.1_演示 ckeditor 上传&插入图片

    本文内容 FineUI ckeditor fckeditor/ckeditor 演示 ckeditor 4.2.1 上传&插入图片 最近看了一下 FineUI_v3.3.1 控件,对里边的 c ...

  6. SuperMap开发入门2——环境部署

    由于超图的相关资源比较少,可参考官方提供的<SuperMap iDesktop 9D安装指南>和<SuperMap iObjects .NET 9D安装指南>完成应用软件和开发 ...

  7. tomcat7部署多个web应用不同编码,端口

    1个tomcat部署多个web应用可以设置不同编码,端口,server.xml配置如下: <?xml version='1.0' encoding='utf-8'?><Server ...

  8. tomcat重启后session没有清除的解决办法

    tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomc ...

  9. vsphere脚本等

  10. Nginx反向代理转发Host设置

    默认情况下反向代理是不会转发请求中的Host头部,如果需要转发,则需要配置红色字体表示的选项参数. location /t02 { proxy_set_header Host $host; proxy ...