iphone sdk CGAffineTransform获取物体的旋转角度

时间:2010-01-12 19:41:38

标签: ios cocoa-touch

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

5 个答案:

答案 0 :(得分:89)

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

无论如何,因为旋转矩阵生成

 cos(x)  sin(x)   0
-sin(x)  cos(x)   0
   0        0     1

您可以使用

恢复角度
return atan2(transform.b, transform.a);

答案 1 :(得分:36)

你可以像这样轻松获得旋转角度:

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

来自documentation

  

核心动画扩展了键值编码协议,允许通过关键路径获取和设置图层CATransform3D矩阵的公共值。表4描述了层的转换和sublayerTransform属性是键值编码和观察符合性的关键路径

答案 2 :(得分:3)

或者你可以使用acos和asin函数。您将得到完全相同的结果:

 NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );

答案 3 :(得分:0)

你可以试试这个:

- (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);    
}

答案 4 :(得分:0)

我知道这是一个非常老的问题,但是,如果像我这样的人使用CALayers和CATransform3D会遇到此问题,则可以与以下方面取得联系:

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) } }

}