2011-01-27 8 views
0

이것은 이상한 요청이지만 코어 애니메이션 (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"]; 

그것은 내가 원하지 않는 활공 동작을 일으킨다. 이 문제를 어떻게 해결할 수 있습니까? 도움을 주시면 감사하겠습니다.

답변

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 초 정도라고 말합니다.)

이름이 animateWithDuration으로 시작하는 UIView 클래스 메소드를 살펴보십시오. 이 같은

뭔가 :

- (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 초에 1 번 타이머를 사용하여 코드를 실행할 수 있습니다. 기본적으로 애니메이션은 쉽고 편한 타이밍을 사용하여 실제 움직임을 아주 잘 모델링합니다. 다른 지속 시간을 시도해보십시오. 그러나 1/15 정도는 좋은 출발점 일 것입니다. (빨리하고 싶지만보기에는 너무 빠르지는 않습니다.)

애니메이션에 흔들림이 생기고 싶다면 훨씬 더 애호가가 필요합니다. 먼저 전체 양만큼 애니메이션 그룹을 이동시킨 다음 정지 점을 소량 씩 오버 슛하고 다시 되돌아가는 반복 애니메이션을 수행합니다.

관련 문제