2016-06-01 5 views
1

현재 두 개의 다른 상태로 작은 버튼을 만들고 있습니다. 모든 상태는 두 개의 CAShapeLayer으로 표현되며 상태 간 전환은 일련의 CAKeyframeAnimation/CABasicAnimation으로 애니메이션되며 모든 모양 레이어의 경로 속성이 변경됩니다. 내 질문은 현재 애니메이션 (즉, 버튼을 움직이는 동안 누른 상태)에서 시작하여 상태로 애니메이션을 적용하는 방법입니다.CAKeyframeAnimation에서 현재 애니메이션 단계를 얻는 방법

일반적으로 프리젠 테이션 레이어에 현재 속성 값을 요청하고 추가 애니메이션 (완벽하게 설명 된대로 here)을 사용합니다. 그러나이 애니메이션은 다중 단계 애니메이션이므로 현재 어떤 애니메이션을 적용하고 있는지 파악해야합니다 그런 다음 해당 애니메이션을 이전 상태로 되돌릴 수 있도록 연결합니다. 하지만 그것은 다소 까다 롭습니다. (모든 애니메이션을 removeOnCompletion=false으로 만들고 애니메이션의 시간 오프셋을 쿼리하여 현재 활성화 된 애니메이션과 현재까지의 애니메이션을 파악할 수 있습니다.)

불행히도 레이어 속도를 0.0으로 설정하고 반대 방향으로 다르게 동작하는 보조 애니메이션이 있기 때문에 timeOffset을 앞뒤로 움직이게해도 효과가 없습니다.

모양 레이어에 사용자 지정 레이어 속성을 사용하는 것이 번거로울 것 같지만 현재 애니메이션 단계와 더 쉽게 진행 속성을 일치시킬 수 있습니다.

답변

2

몇 번의 시행 착오 끝에 나는 다음과 같은 "해결책"을 생각해 냈습니다 : 모든 프레임에 대한 시간 업데이트를 얻고 애니메이션이 시작될 때 타임 스탬프에서 현재 타임 스탬프를 빼서 CADisplayLink을 사용합니다. 경과 된 애니메이션 시간, 따라서 진행 (animationDuration을 통해 나눔으로써). 그런 식으로 오프셋을 사용하여 역방향 애니메이션을 시작할 수 있습니다. 내부적으로 키 프레임 애니메이션에서 다음 프레임을 계산하고 새 기간의 keyTimes를 조정합니다. 이 구현을 볼 수 있습니다 here