Вызвать направление вращения CALAYER?

Этот сводил меня с ума...

Рассмотрение "плоскости" является CALayer, я поворачиваю его в оси X:

plane.transform = CATransform3DMakeRotation(180 * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);

И это заставляет его вращаться по часовой стрелке, который прекрасен.

Теперь, в какой-то момент вовремя, я хочу, чтобы это возвратилось к 0 градусам, таким образом, я использую:

plane.transform = CATransform3DMakeRotation(0 * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);

Вещь..., она делает это против часовой стрелки, который не является тем, что я хочу :(

Я предполагаю, что это использует самый короткий путь вращения, но даже если я говорю этому переходить к 360 градусам вместо этого, когда это сделано, и я говорю этому перезапускать анимацию, это начинает от 360 переходить в 180, и это идет назад вместо правильного направления.

Существует ли путь к обходному решению это?

То, что я сделал бы в Actionscript, будет:

if (plane.rotationX == 360) plane.rotationX = 0;

И это возобновилось бы приятно, но если я делаю то использование CATransform3DMakeRotation, оба преобразования сталкиваются из-за анимации (я думаю), и это испорчено.

Любая справка очень ценилась бы!

Спасибо

5
задан smorgan 15 July 2010 в 05:53
поделиться

1 ответ

Я думаю, ваша проблема заключается в том, что вы ожидаете слишком многого от неявной системы анимации, которая в основном просто интерполирует значения свойств вашего слоя от A до B. Это отлично подходит для самых разных случаев, но не не позволяют вам делать такие вещи, как "цепочка" изменений вместе по порядку. Есть способы сделать последнее, но они определенно менее удобны, чем то, что вы делаете в данный момент. Тем не менее, вы можете исследовать их, чтобы делать что-то «должным образом». (Начните с еще одного взгляда на Базовое руководство по анимации .)

Однако, если вы готовы смириться с дрянным обходным решением, вы можете получить его, чтобы посмотрите, как вы хотите, просто продолжая каждый раз изменять угол поворота в одном и том же направлении, а не устанавливать его на константу 0 или 180 :

// you need to keep track of this somewhere in your code
// (I've made it static for simplicity, you should do something more sensible)
static long currentAngle = 0;

// rotate (another) 180 degrees
currentAngle += 180;
plane.transform = CATransform3DMakeRotation(currentAngle * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);

Я говорю "мог бы", потому что что-то в вашем описании на самом деле не соответствует тому, как я ожидал преобразования, чтобы работать, и явно есть некоторые тонкости реализации, которые я не понимаю должным образом. Такой подход вполне может потерпеть неудачу. Но это банально просто, так что, наверное, стоит попробовать.

1
ответ дан 14 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: