iphone SDK CGAffineTransform получить угол поворота объекта - PullRequest
32 голосов
/ 12 января 2010

как рассчитать угол поворота для любого данного объекта (например, uiimageview)?

Ответы [ 4 ]

89 голосов
/ 12 января 2010

Технически это невозможно, потому что преобразование может включать в себя операцию skew , которая превращает изображение в параллелограмм, а угол поворота больше не определяется.

В любом случае, поскольку матрица вращения генерирует

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

Вы можете восстановить угол с помощью

return atan2(transform.b, transform.a);
36 голосов
/ 15 марта 2012

Вы можете легко получить угол поворота так:

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

Из документации :

Базовая анимация расширяет протокол кодирования значения ключа, позволяя получать и задавать общие значения матрицы CATransform3D уровня через ключевые пути. В таблице 4 описаны ключевые пути, для которых свойства transform и sublayerTransform слоя соответствуют кодированию значения ключа и соблюдают его

3 голосов
/ 24 января 2011

Или вы можете использовать функции acos и asin. Вы получите точно такой же результат:

 NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );
0 голосов
/ 30 ноября 2012

Вы можете попробовать это:

- (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);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...