Есть ли способ выяснить, на сколько градусов поворачивается вид в данный момент во время анимации? - PullRequest
7 голосов
/ 18 мая 2009

Я применяю анимацию преобразования вращения в блоке анимации с этим преобразованием:

CATransform3D rotatedTransform = self.layer.transform;
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;

Начинается анимация, и пользователь запускает другое событие, которое должно было бы подтолкнуть вращение к новой цели. Чтобы рассчитать реалистичное поведение, мне нужно знать текущие градусы поворота, чтобы можно было соответствующим образом сложить следующие градусы поворота.

Ответы [ 4 ]

27 голосов
/ 12 сентября 2009

Это старый вопрос, но я столкнулся с этим ответом, пытаясь найти текущий угол поворота во время анимации ключевого кадра: -

CALayer* layer = [self.layer presentationLayer];
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue];

Кажется, работает на меня. Также красиво и лаконично.

4 голосов
/ 18 мая 2009

Вы можете получить текущее состояние анимирующего слоя, захватив его презентационный слой. Предполагая, что вы не применили никаких других преобразований к слою, вы можете извлечь текущий угол вращающегося слоя, используя следующий код:

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] transform];
float angle;
if (rotationTransform.m11 < 0.0f)
    angle = 180.0f - (asin(rotationTransform.m12) * 180.0f / M_PI);
else
    angle = asin(rotationTransform.m12) * 180.0f / M_PI;

В другом неизмененном преобразовании значения m11 и m12 - это координаты, лежащие на единичной окружности, поэтому вы можете использовать тригонометрию для определения угла, который они описывают.

РЕДАКТИРОВАТЬ (18.05.2009): добавлен тип преобразования в CALayer для преодоления предупреждений компилятора и исправлено присвоение имени преобразованию в операциях тригонометрии.

0 голосов
/ 04 февраля 2017

Попробуйте это:

CGFloat setAngle = 75.0;
CATransform3D t = CATransform3DIdentity;
t.m34 = 0.004;
t = CATransform3DRotate(t, -M_PI/180*setAngle, 0, 1, 0);
self.testView.layer.transform = t;

CGFloat getAngle = 0;
if (t.m11 < 0.0f) {
    getAngle = 180.0f - (asin(t.m13) * 180.0f / M_PI);
} else {
    getAngle = asin(t.m13) * 180.0f / M_PI;
}
NSLog(@"setAngle=%@ getAngle=%@", @(setAngle), @(getAngle));
0 голосов
/ 16 октября 2010

Вы также можете рассчитать его, используя матрицы и тригонометрию. Обратитесь к моему ответу на этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...