как я могу рассчитать угол поворота для любого данного объекта (т.е. uiimageview)?
Iphone sdk CGAffineTransform, получающий угол поворота объекта
Ответ 1
Технически вы не можете, потому что преобразование может включать в себя операцию перекоса, которая превращает изображение в параллелограмму, а угол поворота больше не определен.
Во всяком случае, поскольку матрица вращения порождает
cos(x) sin(x) 0
-sin(x) cos(x) 0
0 0 1
Вы можете восстановить угол с помощью
return atan2(transform.b, transform.a);
Ответ 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 являются кодированием ключа и соблюдением соответствия
Ответ 3
Или вы можете использовать acos и asin функции. Вы получите точно такой же результат:
NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );
Ответ 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, вы можете получить angular с помощью:
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) } }
}