【发布时间】:2010-01-12 19:41:38
【问题描述】:
我如何计算任何给定对象(即 uiimageview)的旋转角度?
【问题讨论】:
标签: ios cocoa-touch
我如何计算任何给定对象(即 uiimageview)的旋转角度?
【问题讨论】:
标签: ios cocoa-touch
技术上你不能,因为变换可以包含一个 skew 操作,它将图像变成平行四边形并且不再定义旋转角度。
不管怎样,由于旋转矩阵生成
cos(x) sin(x) 0
-sin(x) cos(x) 0
0 0 1
你可以恢复角度
return atan2(transform.b, 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
Core Animation 扩展了键值编码协议,允许通过键路径获取和设置层的 CATransform3D 矩阵的公共值。表 4 描述了层的 transform 和 sublayerTransform 属性是键值编码和观察兼容的关键路径
【讨论】:
或者你可以使用 acos 和 asin 函数。你会得到完全相同的结果:
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);
}
【讨论】:
我知道这是一个非常古老的问题,但是,如果像我这样的人使用 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) } }
}
【讨论】: