2012-10-09 9 views
2

CGOS에서 점 집합으로 CALayer에 선을 그린 iOS 용 애니메이션을 작성했습니다. 이 선은 평면 위치에서 다른 y 좌표로 '성형 된'모양으로 움직이지만 항상 동일한 x 좌표로 선 차트 애니메이션과 유사합니다.Core Animation (CABasicAnimation)에서 예기치 않은 동작이 발생했습니다.

포인트 보간을 쉽게하기 위해 CALayer 서브 클래스에 사용자 정의 CGFloat 속성을 추가했습니다. 이 속성을 '애니메이터'라고 부릅니다. (더 나은 이름은 진행, 보간 등이 될 수 있습니다.) 아이디어는 0.0f에서 1.0f까지이 속성에 간단한 CABasicAnimation을 추가하여 Core Animation의 타이밍 함수 및 보간 지원을 사용하는 동안 여전히 맞춤 애니메이션을 쉽게 작성할 수 있습니다. 예를 들어, 라인의 포인트가 y = 100에서 y = 130으로 이동하면 애니메이터가 0.0f 일 때 1.0f에서 점 130에있을 때 나는 100에 있으며 중간 값은 중간 점을 제공하고 이 새로운 포인트로 라인을 다시 그려 내 애니메이션을 얻으십시오.

이제 애니메이션이 잘 작동하고 레이어 작업을 비활성화하고 needsDisplayForKey 등을 추가했지만 내 문제는 Core Animation이 정확하지 않습니다. 애니메이터의 최종 가치는 1.0이 아닌 .95 .96 등입니다. 부동 소수점 숫자에는 정확성 문제가 있기 때문에 괜찮습니다. 그러나 모델 값이 업데이트되면 (애니메이션을 레이어에 추가하기 전에 1.0f로 설정) 선을 다시 그려야하고 정확한 시각적 정보를 얻어야합니다.

여기에 또 다른 문제가 발생합니다. 때때로 애니메이션이 즉시 제거되지 않습니다. 대부분의 경우 즉시 제거되며 아무런 문제가 없지만 때로는 몇 초 또는 몇 분 동안 유지되는 경우도 있습니다. 애니메이션이 제거되지 않는다는 내 이론을 테스트하기 위해 프리 레이어에있을 때 YES를 반환하는 내 레이어에 간단한 BOOL 플래그를 추가했으며 때로는 마지막 drawInContext 호출이 애니메이터 값이있는 프리젠 테이션 레이어에있는 것을 볼 수 있습니다. 0.98967f 또는 애니메이터 1.0f로 최종 drawInContext 호출을하고 표현 레이어 플래그를 NO로 설정하면 훨씬 늦게 발생합니다. 결과적으로 내 시각적 인 점프는 명백한 끔찍한 사용자 경험을 제외하고는 정확하지 않습니다.

내 테스트 프로젝트를 제공하게되어 기쁘게 생각하는 사람이라면 누구나 내 문제를 최대한 설명하려고 노력했다. 똑똑한 사람이 이것을보고 나를 도울 수 있기를 바랍니다.

편집 1 : Xcode 프로젝트 전체를 업로드했습니다 (불쾌한 편집을 포함하여 내가 시도한 모든 것을 보여줍니다) here.

편집 2 : 수동으로 http://lucas.tiz.ma/blog/2012/04/18/core-animation-is-a-bit-garbage-collection-y/

감사 완료에 애니메이션을 제거하는 유사한 문제를 가진 사람.

+0

애니메이션 등의 코드를 우리에게 보여줄 수 있다면 도움이 될 것입니다. –

+0

많은 드로잉 코드와 5 행 등을 만드는 컨트롤러 코드를 볼 수 있습니다. 어딘지 업로드하면 더 좋을까요? –

+0

질문을 편집하고 프로젝트를 보관 용 계정에 업로드했습니다. –

답변

0

tl; dr animationDidStop : finished : 위임 콜백에서 setNeedsDisplay를 명시 적으로 호출하십시오.

Lucas Tizma의 게시물 (위의 2 번 편집 참조)에 따라 애니메이션을 수동으로 제거해 보았습니다. 저는 블록 기반의 것보다 간단한 접근 방식을 선택했습니다. 레이어 기반의 레이어는 애니메이션의 대표자로 설정되었습니다. 이 방법으로 애니메이션 시작 및 중지 콜 백이 직접 관련 레이어로 전달됩니다. animationDidStop에서 잘 명시 적으로 애니메이션을 제거합니다. 완료 : 콜백해도 문제가 해결되지 않습니다. 예를 들어 (때때로 타임 스탬프 아래의 로그 참조) 애니메이션이 중지되고 제거되었다는 것을 확인하면 제거 된 것으로 표시되지만 실제 모델 값으로 정확한 그리기가 훨씬 늦게 발생합니다.

// animationDidStop:finished: call back code 

NSLog(@"layer animation stopped"); 

// check if any animations exist 
NSLog(@"animation keys: %@", [self animationKeys]); 

// remove animations and check 
NSLog(@"removing animations"); 
[self removeAllAnimations]; 
NSLog(@"animation keys: %@", [self animationKeys]); 

// log 

2012-10-11 11:47:16.774 ASPathAnimationTest[3017:c07] on presentation layer 1 
2012-10-11 11:47:16.774 ASPathAnimationTest[3017:c07] 335 animation draw update, animator is 0.982606 
2012-10-11 11:47:16.775 ASPathAnimationTest[3017:c07] startPoint: {100, 90} - endPoint: {100, 100} - newPoint: {100, 99.8261} 
<snip> 
2012-10-11 11:47:16.791 ASPathAnimationTest[3017:c07] startPoint: {1000, 50} - endPoint: {1000, 100} - newPoint: {1000, 99.1303} 
2012-10-11 11:47:16.792 ASPathAnimationTest[3017:c07] layer animation stopped 
2012-10-11 11:47:16.792 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.793 ASPathAnimationTest[3017:c07] removing animations 
2012-10-11 11:47:16.793 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] layer animation stopped 
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] removing animations 
2012-10-11 11:47:16.795 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.795 ASPathAnimationTest[3017:c07] layer animation stopped 
2012-10-11 11:47:16.819 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.820 ASPathAnimationTest[3017:c07] removing animations 
2012-10-11 11:47:16.820 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] layer animation stopped 
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] removing animations 
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] layer animation stopped 
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:47:16.823 ASPathAnimationTest[3017:c07] removing animations 
2012-10-11 11:47:16.823 ASPathAnimationTest[3017:c07] animation keys: (null) 
2012-10-11 11:48:00.000 ASPathAnimationTest[3017:c07] on presentation layer 0 
2012-10-11 11:48:00.000 ASPathAnimationTest[3017:c07] 336 animation draw update, animator is 1.000000 
<snip, there are 5 lines so draw and point logs go here> 
2012-10-11 11:48:00.021 ASPathAnimationTest[3017:c07] 340 animation draw update, animator is 1.000000 
2012-10-11 11:48:00.023 ASPathAnimationTest[3017:c07] startPoint: {100, 90} - endPoint: {100, 100} - newPoint: {100, 100} 
<snip> 
2012-10-11 11:48:00.026 ASPathAnimationTest[3017:c07] startPoint: {1000, 50} - endPoint: {1000, 100} - newPoint: {1000, 100} 

로그를 보는 애니메이션은 정말 초 또는 분 나중에 내가 animationDidStop을 변경할 때까지 실제 정확한 모델 값으로 다시 그리기가 가끔 발생하지 않습니다 단지의 제거되고 있다는 사실을 알아 차리지 후 : 완료 : 레이어의 setNeedsDisplay를 명시 적으로 호출하기 위해 콜백을 위임합니다. 빙고.

관련 문제