2011-01-27 5 views
0

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

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"]; 

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

ответ

1

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

+0

Спасибо за ответ, хотя я слышал, что использование CALayers ускорит производительность приложений. Кроме того, я нашел пример того, что я ищу, хотя автор не очень хорошо его объяснил: http://blog.moonshine-project.com/en/2010/03/14/implicit-animation-of -custom-calayer-properties/ –

+0

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

+0

Будет ли что-то делать в производительности приложений? Похоже, это ускорит его. Кроме того, это только я придирчивый, но большинство часовых приложений имеют реалистичное чувство к их аналоговым часам. Когда вторая рука движется, она немного вибрирует. Посмотрите на стандартное приложение мирового времени, которое поставляется с iPhone для примера. –

0

Простым способом сделать это было бы просто применить преобразование к вашему представлению. Вторая рука защелкнулась бы от одного положения к другому. Просто измените поворот на 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, вероятно, хорошая отправная точка (вы хотите, чтобы это было быстро, но не слишком быстро, чтобы видеть.)

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

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