Ios iphone sdk CGAffineTransform获取对象的旋转角度
如何计算任何给定对象(即uiimageview)的旋转角度?从技术上讲,你不能,因为变换可以包括一个倾斜操作,该操作将图像转换为平行四边形,旋转角度不再定义 无论如何,由于旋转矩阵生成Ios iphone sdk CGAffineTransform获取对象的旋转角度,ios,cocoa-touch,Ios,Cocoa Touch,如何计算任何给定对象(即uiimageview)的旋转角度?从技术上讲,你不能,因为变换可以包括一个倾斜操作,该操作将图像转换为平行四边形,旋转角度不再定义 无论如何,由于旋转矩阵生成 cos(x) sin(x) 0 -sin(x) cos(x) 0 0 0 1 你可以用它来恢复角度 return atan2(transform.b, transform.a); 也可以使用acos和asin函数。您将得到完全相同的结果: NSLog (@"%f %
cos(x) sin(x) 0
-sin(x) cos(x) 0
0 0 1
你可以用它来恢复角度
return atan2(transform.b, transform.a);
也可以使用acos和asin函数。您将得到完全相同的结果:
NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );
您可以很容易地获得如下旋转角度:
CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
例如:
view.transform = CGAffineTransformMakeRotation(0.02);
CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
NSLog(@"%f", angle); // 0.020000
从: 核心动画扩展了键值编码协议,允许通过键值路径获取和设置层的CATTransferM3D矩阵的公共值。表4描述了层的变换和子层变换属性为键值编码和遵循的关键路径 您可以尝试以下方法:
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint newLocationPoint = [[touches anyObject] locationInView:self.superview];
int x = self.center.x;
int y = self.center.y;
float dx = newLocationPoint.x - x;
float dy = newLocationPoint.y - y;
double angle = atan2(-dx,dy);
self.layer.position = self.center;
self.layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1);
NSLog(@"touchesMoved %f %f %d,%d %f,%f angle:%f",newLocationPoint.x,newLocationPoint.y,x,y,dx,dy,angle);
}
我知道这是一个非常古老的问题,但如果像我这样的人使用CALayers和CatTransformM3D遇到这个问题,你可以通过以下方式获得角度:
extension CATransform3D {
var xAxisAngle: CGFloat { get { return atan2(self.m23, self.m33) } }
var yAxisAngle: CGFloat { get { return atan2(self.m31, self.m11) } }
var zAxisAngle: CGFloat { get { return atan2(self.m12, self.m11) } }
}
什么是变换b和变换a?b和a是变换的属性吗?我从未见过这些。@openfrog:这方面的文档在哪里?虽然这很好,但我不确定它是否能通过苹果的检查。@RichardJ.RossIII-这是:很好的答案,把我从一个巨大的问题中解救出来+1只有在没有缩放时,您建议的标识才是正确的。如果还有缩放功能,则必须使用atan()函数。非常有用,快速简单回答+1