最近在研究CGAffineTransform.
想先讲一下我对CGAffineTransform的理解.
struct CGAffineTransform
{
CGFloat a, b, c, d;
CGFloat tx, ty;
};
CGAffineTransform是二维的,可以理解为
其中,ad对应缩放,bc对应旋转,tx,ty对应位移
我看到大部分的教程说,公式可以总结为
x = ax+cy+tx
y = bx+dy+ty
具体的例如
移动:
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
缩放:
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
旋转:
CGAffineTransformMakeRotation(CGFloat angle)
现在有这样一段代码:
self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100, 200, 200)];
self.imageView.image = [UIImage imageNamed:@"123.jpg"];
[self.view addSubview:self.imageView];
NSLog(@"%@",NSStringFromCGRect(self.imageView.frame));
CGAffineTransform transform = CGAffineTransformIdentity;
transform = transform = CGAffineTransformMake(-0.5, 0, 0, 1, 0, 0);
self.imageView.layer.affineTransform = transform;
NSLog(@"%@",NSStringFromCGRect(self.imageView.frame));
通过代码可以得出 两次的log为
CALayerBaseDemo4[14986:1448501] {{100, 100}, {200, 200}}
2016-02-25 23:55:19.766
CALayerBaseDemo4[14986:1448501] {{150, 100}, {100, 200}}
通过之前的公式
x = ax+cy+tx
y = bx+dy+ty
x = -0.5*100 + 0*100 + 0
x = -50y = 0*100 + 1*100 + 0
y = 100
如果通过这么计算的话,应该是 {-50,100} 才对啊,问题是得到的结果是{150,100} 这事为什么呢?
我猜原因可能有这些:
文档里介绍 CGAffineTransform 原理时所使用的坐标系 +x 朝右,+y 朝上,而在实际开发中 iPhone 屏幕的坐标系是做了旋转的,是 +x 朝右,+y 朝下。
对一个 View 做 transform 都是基于 View 自己的坐标系进行变换,那么就尤其需要搞清楚实际上相对其 SuperView 的坐标系的变换是不是如你设想的那样。
之前研究过 CGAffineTransform,印象里有这些需要注意的。希望对你有用。
师兄,这个问题解决了嘛?跟着你的思路走,貌似是你这个结果。
补充内容:
刚刚我又去网上搜索一下transeform矩阵相关,依照师兄你的计算最后x' = - 0.5x, y' = y,并不能直接以结果来确定你所说的(-50,100),应该对比着来看,x' = -0.5x是否可以理解为:仿射过后的图像x值被缩小了0.5倍,y' = y理解为前后不变;再加上图形本身的锚点坐标限制,图形被压缩。与师兄你的log信息才能对的上。不知道是不是这样理解的