iphone sdk CGAffineTransform获取对象的旋转angular度

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

在技​​术上你不能,因为变换可以包括一个扭曲操作,将图像变成平行四边形,旋转angular度不再被定义。

无论如何,由于旋转matrix产生

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

你可以用angular度恢复angular度

 return atan2(transform.b, transform.a); 

你可以很容易的得到这样的旋转angular度:

 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 

从文档 :

Core Animation扩展了键值编码协议,允许通过关键path获取和设置图层的CATransform3Dmatrix的公共值。 表4描述了图层的transform和sublayerTransform属性是关键值编码和观察兼容的关键path

或者你可以使用acos和asinfunction。 你会得到完全一样的结果:

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

你可以试试这个:

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