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 制作视图控制器?
MAP 与 iPhone 3.0 SDK 一起使用都有哪些限制?
Iphone 4 sdk - 如何确定 applicationWillEnterForeground 是不是因通知而被触发?