2009-06-23 2 views
14

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

(Цель состоит в том, чтобы иметь возможность анимировать вращение через тупых угла дуги более 180 градусов, вместо того анимация «обмануть» и идти по кратчайшему пути, то есть, с помощью противоположной , ОСТРАЯ меньший угол. - что может произойти, когда есть только один [т.е. назначения] ключевой кадр Для перехода на «длинный» путь вокруг, я полагаю, мне нужно дополнительное ключевых кадров на полпути через, вдоль желаемого дуги)

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

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 

... 

[UIView beginAnimations:nil context:nil]; 
CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(desiredEndingAngle)); 
[UIView setAnimationDuration:0.5]; 
graphic.transform = cgCTM; 
[UIView commitAnimations]; 

Как я понимаю, я не ищу анимации вдоль пути (так как это для перевода, а не вращение) ...

Во всяком случае, любая помощь будет очень признателен! Заранее спасибо.

+0

Одно быстрое разъяснение (так как прошло некоторое время с тех пор, как я взял Геометрию!). Цель состоит в том, чтобы вращать иглу на датчике типа SPEEDOMETER, маркировка которого составляет более 180 градусов. Как сейчас, когда игла идет от 0 до близкого Макс, она берет кратчайшее расстояние, чтобы добраться туда ... таким образом, пересекаясь через область «6 часов», где нет разметки (например, где она вместо этого говорит «MPH»). Мне нужен способ, по сути, указать, какое НАПРАВЛЕНИЕ происходит с поворотом. Предположительно, это означает по часовой стрелке/против часовой стрелки или через заданную среднюю точку. Следовательно, идея дополнительного ключевого кадра. Благодаря! – 2009-06-23 23:16:22

ответ

18

Думаю, что я получил его.

Вот код, который делает (в данном примере) полный 270 градусный поворот (1,5 * пи радиан), в том числе различных параметров, которые могут быть настроены дальше:

CALayer *layer = rotatingImage.layer; 
CAKeyframeAnimation *animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.duration = 0.5f; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.values = [NSArray arrayWithObjects:  // i.e., Rotation values for the 3 keyframes, in RADIANS 
     [NSNumber numberWithFloat:0.0 * M_PI], 
     [NSNumber numberWithFloat:0.75 * M_PI], 
     [NSNumber numberWithFloat:1.5 * M_PI], nil]; 
animation.keyTimes = [NSArray arrayWithObjects:  // Relative timing values for the 3 keyframes 
     [NSNumber numberWithFloat:0], 
     [NSNumber numberWithFloat:.5], 
     [NSNumber numberWithFloat:1.0], nil]; 
animation.timingFunctions = [NSArray arrayWithObjects: 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], // from keyframe 1 to keyframe 2 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil]; // from keyframe 2 to keyframe 3 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:animation forKey:nil]; 

Спасибо!

+0

Это работает для [поворота на 360 градусов] (http://stackoverflow.com/a/1216951/1309352). –

1

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

UIImageView* rotatingImage = [[UIImageView alloc] init]]; 
[rotatingImage setImage:[UIImage imageNamed:@"someImage.png"]]; 

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); 
CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; 
rotationAnimation.duration = 0.25f; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = 1; 

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

Привет, Натан! Большое спасибо за ответ и ваш опыт. Я получаю следующую ошибку в последней строке: «запрос для слоя участника» в чем-то, что не является структурой или объединением ». Я предполагаю, что мне не хватает других настроек (поскольку UIImage обычно не имеет свойства Layer). Будучи совершенно новым для Core Animation, я все еще немного застрял. [Также не уверен, как именно это определяет среднюю точку, или, альтернативно, НАПРАВЛЕНИЕ для вращения (по существу выбор по часовой стрелке или против часовой стрелки), но я уверен, что это станет очевидным, как только я смогу заставить это запустить.] Многие благодаря вам/всем за любую дополнительную помощь! – 2009-06-23 23:03:51

+0

Я исправил образец кода - я добавлял анимацию в UIImage вместо UIImageView, содержащего UIImage, который не будет работать по понятным причинам :-) –

+0

Спасибо, Натан, это действительно имеет смысл, и теперь он компилируется. Однако, насколько я могу судить, я, к сожалению, возвращаюсь примерно туда, где начал: «Попытка сделать поворот, скажем, на 270 градусов (1,5 * pi радианов) в одном направлении ... приводит к * 90 градусам * вращение в противоположном направлении (т. е. короткий путь «круглый»)! Я считаю, что ответ - с CAKeyframeAnimation, а не с CABasicAnimation, поскольку он дает гораздо больший контроль над фактическим движением. Я играю с этим и буду публиковать любой ответ, который я придумал, или любые другие вопросы под отдельным сообщением. Спасибо за ваше время! – 2009-06-25 00:33:38

1
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 100, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 100, 100, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 615, 900, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 615, 900, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 100, 100, 80); 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.path = path; 
pathAnimation.duration = 10.0; 
[someLayer addAnimation:pathAnimation forKey:nil]; 
Смежные вопросы