iOS开发 ☞ 仿射变换

原文链接:http://blog.csdn.net/magiczyj/article/details/51316480

In English,Affine means 仿射,Transform means 变换,so,you know it.

来看一个常量

/* The identity transform: [ 1 0 0 1 0 0 ]. */

CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

一般形式

CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
  CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

仿射变换的原理:基于高数的矩阵变换
计算规律:C = A的行✖️B的每一列

矩阵A = [      ]
          1  1 
          2  0
        [      ]
矩阵B = [         ]
          0  2  3
          1  1  2
        [         ]

 矩阵C = A * B =     [         ]
                      1  3  5
                      0  4  6
                    [         ]

仿射变换的矩阵计算

self.label.transform = CGAffineTransformMake(<#CGFloat a#>, <#CGFloat b#>, <#CGFloat c#>, <#CGFloat d#>, <#CGFloat tx#>, <#CGFloat ty#>)
对应矩阵如下:
B =    [         ]
          a  b  0
          c  d  0
          tx ty 1
        [         ]
由上面的矩阵变换的基础计算可以得到平面上任意一点设为A =【x y 1】变换后的计算公式为

  C = [  (a*x+c*y+tx)  (b*x+d*y+ty)  (1) ]
由A经过矩阵B变换后得到的C进行比较,得出:
x' = a*x + c*y + tx
y' = b*x + d*y + ty
由上面这个公式随便举个例子,我们让a、d=1 其余均为0  得到
x' = x
y' = y 
这就是 CGAffineTransformIdentity (未发生变换)

一般公式推导平移

设a,d=1 c,b = 0 
由
x' = a*x + c*y + tx
y' = b*x + d*y + ty
得:
x' = x + tx
y' = y + ty
可以知道tx代表视图沿X轴方向的位移,ty代表视图沿Y轴方向的位移
所以使用一般公式实现视图沿X轴平移50如下实现:
CGAffineTransformMake(1,0,0,1,50,0)

一般公式推导缩放

设 c,b,tx,ty = 0x' = a*x + c*y + tx
y' = b*x + d*y + ty
得:
x' = a*x 
y' = d*y 

一般公式推导剪切

设 a,d = 1 tx,ty = 0
由
x' = a*x + c*y + tx
y' = b*x + d*y + ty
得
x' = x + cy
y' = y + bx 

一般公式推导旋转

//仿射旋转矩阵
       [                  ]
          cosa   sina   0
         -sina   cosa   0
           0      0     1
       [                  ]
       CGAffineTransformMake(CGFloat( cos(M_PI_4) ), CGFloat( sin(M_PI_4) ), -CGFloat( sin(M_PI_4) ), CGFloat( cos(M_PI_4) ), 0, 0)

其他的常用方法:

//检查是否有做过仿射效果
  CGAffineTransformIsIdentity(transform)
 //检查2个仿射效果是否相同
  CGAffineTransformEqualToTransform(transform1,transform2)
//仿射效果反转(反效果,比如原来扩大,就变成缩小)
  CGAffineTransformInvert(transform)

在众多动画中,仿射动画确实功能强大,对一些系统无法改变frame的控件,我们都可以通过它来改变。

在很多时候,我们在使用UIView动画实现控件大小改变的时候,如果frame设置实现不了动画效果,我们可以使用仿射变化达到目的。

使用仿射变化首先应该明白layer层的一个属性—-锚点
这里写图片描述

默认仿射变化的锚点是(0.5,0.5),以前做过仪表盘动画的都知道在视图旋转时我们要调整锚点,否则无法凸显那是个指针。。。,关于锚点,就不多做解释了。

使用锚点的注意点如下:
1、锚点决定了动画的方向,也就是说视图选定的锚点不同时,动画效果是不一样的,依照情况定。

2、在动画开始前,应当已经设置好视图的锚点。

3、在设置视图的frame之前,应当设置好视图的锚点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值