2009-02-12 6 views
28

Я пишу приложение для iPhone, и у меня есть изображение, которое я хотел бы закрутить наружу.Могу ли я использовать CGAffineTransformMakeRotation для поворота изображения более чем на 360 градусов?

В настоящее время мой код выглядит следующим образом (завернутый в beginAnimations/commitAnimations блок):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f); 
swirl = CGAffineTransformRotate(scale, M_PI); 
[player setTransform:swirl];  
[player setAlpha:0.0f]; 

Но я считаю, что если я попытаюсь изменить угол поворота, скажем, 4 * M_PI, это не вращается вообще. Можно ли получить поворот 720˚ с помощью CGAffineTransformRotate, или мне нужно переключиться на другую технологию?

Если мне нужно переключиться на другую технологию, вы бы порекомендовали использовать другой поток (или таймер) для самостоятельной анимации или был бы лучше OpenGL?

Thanks,
Blake.

ответ

64

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

- (void) runSpinAnimationWithDuration:(CGFloat) duration; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

    [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 
+0

Это работает. Спасибо, что опубликовали его и настаивали на комментировании сообщений других людей! Я собирался разделить мою анимацию! – Dimitris

+0

Я тоже их разделял, и это просто казалось неправильным. – mahboudz

+0

убедитесь, что вы сделали это для transform.rotation.z У меня возникли проблемы с попыткой просто сделать это с помощью преобразования CATransform3DMakeRotation. Когда я использовал функцию поворота, я продолжал работать в «кардановом замке». Когда я использую transform.rotation.z, как указано выше, он работает красиво! – Jay

5

Вы можете, но вам нужно разделить свою анимацию на полукруговые вращения. Я приведу пример этого в ответ на this question, используя повторяющуюся CABasicAnimation, применяемую к слою под представлением. Как я предлагаю там, делать эти половинные вращения как части CAKeyframeAnimation, вероятно, будет лучшим способом структурировать это, потому что анимация будет более гладкой (в моем примере есть небольшая зацепка между полувращениями), и вы могли бы сделать хорошее ускорение/замедление в начале и в конце.

+0

Прохладный. Это, похоже, делает то, на что я надеялся, и я полагаю, что могу добавить к нему масштабирующее преобразование и получить уведомление обратно в свой класс самостоятельно. Спасибо! – bwinton

+2

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

+0

У вас есть, если вы полагаетесь на CATransform3D в качестве значения, которое вы анимируете. Я не думал о вашем подходе, используя расширения keypath, которые Core Animation предоставляет для полей структуры преобразования. Вы правы, это, вероятно, более чистый способ приблизиться к этому. –

5

Ответить на заголовок: Да, CGAffineTransform может вращаться более чем на 360 градусов.
Отвечать на вопрос: Да, но вы не можете его оживить, потому что ничего не нужно оживлять.

Помните, что the affine transformation is a matrix и что матрица вращения содержит синусоидальные и косинусные числа предварительно вычислено. Это как если бы вы сказали:

CGFloat angle = 4.0 * M_PI; 
NSAffineTransformStruct matrix = { 
    .m11 = cos(angle), 
    .m12 = sin(angle), 
    .m21 = -sin(angle), 
    .m22 = cos(angle), 
    .tx = 0.0, 
    .ty = 0.0 
}; 
NSAffineTransform *transform = [NSAffineTransform transform]; 
[transform setTransformStruct:matrix]; 

Теперь давайте рассмотрим некоторые примеры значений для cos и sin:

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • cos(4π) = 1
  • sin(4π) = 0

Помните, что матрица не содержит угол - он содержит только косинус и синус. И эти значения не меняются от одного кратного круга к другому. Поэтому нет ничего, что можно было бы оживить.

(Обратите внимание, что Calculator.app дает неправильные результаты для соз (xπ) и грех (xπ). Попробуйте Grapher, calc или Google.)

Вам нужно будет разделить анимацию на фракции круга. Полукруги, предложенные Брэдом Ларсоном, будут очень хорошими.

+2

Вам не нужно разделить анимацию. См. Мой ответ. – mahboudz

 Смежные вопросы

  • Нет связанных вопросов^_^