zoukankan      html  css  js  c++  java
  • UIView的transform

    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

  • 相关阅读:
    《Linux内核分析》第七周学习笔记
    《深入理解计算机系统》第七章学习笔记
    《Linux内核设计与实现》第三章学习笔记
    《Linux内核分析》第六周学习笔记
    《Linux内核设计与实现》第十八章学习笔记
    《Linux内核分析》第五周学习笔记
    20182319彭淼迪 2018-2019-1《程序设计与数据结构》课程总结
    实验九报告
    第十周学习总结
    haffman树的实现
  • 原文地址:https://www.cnblogs.com/isItOk/p/7262410.html
Copyright © 2011-2022 走看看