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

Posted

技术标签:

【中文标题】iphone sdk CGAffineTransform 获取对象的旋转角度【英文标题】:iphone sdk CGAffineTransform getting the angle of rotation of an object 【发布时间】:2010-01-12 19:41:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

技术上你不能,因为变换可以包含一个 skew 操作,它将图像变成平行四边形并且不再定义旋转角度。

不管怎样,由于旋转矩阵生成

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

你可以恢复角度

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

【讨论】:

什么是transform.b和transform.a? b 和 a 是变换的属性吗?没见过。 @openfrog: developer.apple.com/iphone/library/documentation/…【参考方案2】:

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

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:

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

【讨论】:

这方面的文档在哪里?虽然这很好,但我不确定它会通过苹果的检查。 @RichardJ.RossIII - 这里是:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… 很好的答案,让我摆脱了一个巨大的问题。 +1【参考方案3】:

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

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

【讨论】:

你建议的身份只有在没有缩放的情况下才是真实的。如果还有缩放,则必须使用 atan() 函数。 非常有帮助,拍摄和简单的回答 +1【参考方案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);    

【讨论】:

【参考方案5】:

我知道这是一个非常古老的问题,但是,如果像我这样的人使用 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)  



【讨论】:

以上是关于iphone sdk CGAffineTransform 获取对象的旋转角度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iOS 6 sdk 为 iPhone 4s 或 iPhone 4 制作视图控制器?

iPhone:Airplay SDK有啥用?

MAP 与 iPhone 3.0 SDK 一起使用都有哪些限制?

我在哪里可以获得 iPhone 2.0 SDK?

Iphone 4 sdk - 如何确定 applicationWillEnterForeground 是不是因通知而被触发?

在iPhone 3.0 SDK中改变了渐变技巧?