看到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.x
static inline CGFloat CGAffineTransformGetScaleX(CGAffineTransform transform) {
return sqrt(transform.a * transform.a + transform.c * transform.c);
}
/// Get the transform's scale.y
static inline CGFloat CGAffineTransformGetScaleY(CGAffineTransform transform) {
return sqrt(transform.b * transform.b + transform.d * transform.d);
}
/// Get the transform's translate.x
static inline CGFloat CGAffineTransformGetTranslateX(CGAffineTransform transform) {
return transform.tx;
}
/// Get the transform's translate.y
static 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大神的以上方法的依据也有了认知。
结论:
1、a,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)是跟着变换的。