Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iphone sdk CGAffineTransform获取对象的旋转角度_Ios_Cocoa Touch - Fatal编程技术网

Ios iphone sdk CGAffineTransform获取对象的旋转角度

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 %

如何计算任何给定对象(即uiimageview)的旋转角度?

从技术上讲,你不能,因为变换可以包括一个倾斜操作,该操作将图像转换为平行四边形,旋转角度不再定义

无论如何,由于旋转矩阵生成

 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