Негладкая анимация с базовой анимацией - PullRequest
0 голосов
/ 28 января 2011

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

UIImage *arrowImage = [UIImage imageNamed:@"arrow.jpg"];

CALayer *arrow = [CALayer layer];
arrow.contents = (id)arrowImage.CGImage;
arrow.bounds = CGRectMake(0, 0, 169.25, 45.25);
arrow.position = CGPointMake(self.view.bounds.size.width / 2, arrowImage.size.height / 2);
arrow.anchorPoint = CGPointMake(0.0, 0.5);

[self.view.layer addSublayer:arrow];

CABasicAnimation *anim1 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim1.fromValue = [NSNumber numberWithFloat:0];
anim1.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
anim1.duration = 4.0;
[arrow addAnimation:anim1 forKey:@"transform"];

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

Ответы [ 2 ]

1 голос
/ 28 января 2011

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

0 голосов
/ 05 апреля 2012

Простой способ сделать это - просто применить преобразование к вашему представлению. Секундная стрелка будет переходить из одной позиции в другую. Просто измените вращение на 360/60 = 6 градусов за каждую секунду.

Если вы хотите, чтобы секонд-хенд делал анимацию для каждого тика, вы можете использовать очень быструю анимацию на основе блоков UIView. (скажем, с продолжительностью 1/15 секунды или около того.)

Посмотрите на методы класса UIView, имена которых начинаются с animateWithDuration.

Примерно так:

- (void) moveSecondHand;
{
  seconds++;
  angle = M_PI*2*seconds/60 - M_PI/2;
  CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
  [UIView animateWithDuration: 1.0/15
    animations: *{
      secondHand.transform = transform
    }];
}

Вот и все, что нужно. Вы запускаете этот код с помощью таймера раз в секунду. По умолчанию в анимациях используется время замедления, что очень хорошо моделирует физическое движение. Попробуйте разные длительности, но 1/15, вероятно, является хорошей отправной точкой (вы хотите, чтобы это было быстро, но не слишком быстро, чтобы видеть.)

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

...