CGAffineTransform的疑惑探索

来源:互联网 发布:中国航信网络面试 编辑:程序博客网 时间:2024/05/17 04:48

看到YYKit大神写的这几行代码,有些疑惑,特此记。

/// Get the transform rotation./// @return the rotation in radians [-PI,PI] ([-180°,180°])static inline CGFloat CGAffineTransformGetRotation(CGAffineTransform transform) {    return atan2(transform.b, transform.a);}/// Get the transform's scale.xstatic inline CGFloat CGAffineTransformGetScaleX(CGAffineTransform transform) {    return  sqrt(transform.a * transform.a + transform.c * transform.c);}/// Get the transform's scale.ystatic inline CGFloat CGAffineTransformGetScaleY(CGAffineTransform transform) {    return sqrt(transform.b * transform.b + transform.d * transform.d);}/// Get the transform's translate.xstatic inline CGFloat CGAffineTransformGetTranslateX(CGAffineTransform transform) {    return transform.tx;}/// Get the transform's translate.ystatic inline CGFloat CGAffineTransformGetTranslateY(CGAffineTransform transform) {    return transform.ty;}

这是YYKit大神些的关于CGAffineTransform的一些获取比例和平移量的方法。对于其使用到的transform参数甚是不解,学习下。

作用:transform,是定义在二维空间上完成View的变换的属性。

初始化方法:

 CGAffineTransform transform  = CGAffineTransformMake(CGFloat a,CGFloat b,CGFloat c,CGFloa td,CGFloat tx,CGFloat ty)

transform参数结构:

这里写图片描述

根据该结构可以得到一个3x3的矩阵表达式:

这里写图片描述

矩阵算法公式:

这里写图片描述

根据计算公式就比较容易理解CGAffineTransform中的各个参数的意思了,对YYKit大神的以上方法的依据也有了认知。

结论:

1a,d 会直接影响视图的缩放2、c会影响视图宽度的改变,b会影响视图高度的改变3、tx会影响在x方向的偏移量, ty会影响在y方向的偏移量 

感谢燃烧的大叔的博文提供的资源和结论为我解决了不少疑惑:

燃烧的大叔的结论:

1、x按照a值进行了比例缩放,y按照d的值进行比列缩放,最重要的是缩放的过程中View的point(中心点)是不会改变的。

接着对b,c,t.x ,ty,进行深度研究发现:

2、x会跟着c的值进行拉伸(View的宽度是跟着改变),y会跟着b的值进行拉伸(View的高度跟着改变),要注意到的是c和b的值改变不会影响到View的point(center中心点)的改变。这是个很有意思的两个参数。

3、x会跟着t.x进行x做表平移,y会跟着t.y进行平移。这里的point(center)是跟着变换的。

博文连接: http://www.jianshu.com/p/6c09d138b31d