Нужна помощь с анимацией на iPhone - PullRequest
3 голосов
/ 14 февраля 2009

Я работаю над приложением анимированных часов для iPhone, и мне нужно повернуть все 3 узла в представлении, полученном в следующем коде:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

clockarm.layer.anchorPoint = CGPointMake(0.0, 0.0);
[CATransaction commit];

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions];
[CATransaction setValue:[NSNumber numberWithFloat:50.0] forKey:kCATransactionAnimationDuration];

CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:-60.0];
animation.toValue = [NSNumber numberWithFloat:2 * M_PI];
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
animation.delegate = self;
[clockarm.layer addAnimation:animation forKey:@"rotationAnimation"];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];


[CATransaction commit];

Проблема в том, что он вращается один раз, т.е. только 360 градусов, а затем останавливается. Я хочу вращать иглы до бесконечности. Как бы я это сделал?

Ответы [ 6 ]

4 голосов
/ 14 февраля 2009

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

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

4 голосов
/ 14 февраля 2009

Я никогда не делал этого, но вот что я попробую. Вы уже установили делегата на self. Реализуйте метод делегата animationDidStop:finished: и просто вызовите метод, в который вы поместите код выше. Обязательно вызовите его в основном потоке (используя executeOnMainThread).

3 голосов
/ 14 февраля 2009

Добавьте метод делегата animationDidFinish и снова настройте анимацию для другого поворота. CA не позволит вам поворачивать предметы более чем на 360 градусов.

1 голос
/ 19 января 2010

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

P.S. Ваше значение fromValue выглядит в градусах, но оно должно быть в радианах.

0 голосов
/ 23 мая 2010

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

0 голосов
/ 06 мая 2009

Я использую "scalingAnimation.repeatCount = 1000000000;" с целью. Не уверен, что это путь для тебя.

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