방금 다음과 같은 키 프레임 애니메이션을 만들었습니다.
[UIView animateKeyframesWithDuration:10 delay:0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0 relativeDuration:.1 animations:^{
view.alpha = 0;
}];
} completion:nil];
그리고 이것은 CAKeyframeAnimation
생성됩니다.
(lldb) po [self.layer animationForKey:@"opacity"]
<CAKeyframeAnimation:0x10a6364b0; keyTimes = (
0,
"0.1",
1
); values = (
1,
0,
0
); calculationMode = linear; delegate = <UIViewKeyframeAnimationState: 0x10a6358d0>; fillMode = both; timingFunction = easeInEaseOut; duration = 10; keyPath = opacity>
질문:
전체 애니메이션에는 10 초가 걸리고 불투명도는 10 * 0.1 = 1 초 동안 애니메이션됩니다. 맞죠? 애니메이션을 보면 변화가 1 초 이상 애니메이션됩니다.
왜?
그 이유는 애니메이션의 타이밍 기능이 선형이 아니기 때문입니다.
"시간과 공간은 상대적인 개념입니다." - 상대성 이론
레이어와 애니메이션은 계층 적 타이밍 시스템을 사용합니다. 여기서 각 오브젝트는 부모 및 자체 타이밍 매개 변수에 따라 자체 현지 시간을 갖습니다.
예를 들어 애니메이션에는 페이싱을 정의하는 타이밍 기능이 있습니다. UIKit에 의해 생성 된 애니메이션의 기본 타이밍 함수는 천천히 시작하고 지속 시간 동안 가속 한 다음 완료하기 전에 다시 느려지는 타이밍을 정의하는 ease-in ease-out 타이밍 함수입니다. 갑자기 시작되거나 중지되지 않는 부드러운 애니메이션을 만듭니다. 그러나 정확한 타이밍이 필요할 때 귀찮은 키 프레임 애니메이션의 키 시간도 조정됩니다.
메소드에 UIViewAnimationOptionCurveLinear
옵션을 전달하여 ease-in ease-out 타이밍을 비활성화 할 수 있습니다 animateKeyframesWithDuration:delay:options:animations:completion:
. 나는 그것이 당신이에서 값을 캐스팅하기 위해 필요로하는 의도인지 확실하지 않다 UIViewAnimationOptions
로 UIViewKeyframeAnimationOptions
및 설명서가 그것에 대해 아무 말도하지 않습니다. 더 나은 (그러나 더 자세한) 방법은 다음과 같이 표준 애니메이션 블록 내에 키 프레임 애니메이션 블록을 포함하는 것입니다.
[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
[UIView animateKeyframesWithDuration:0 /*inherited*/ delay:0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0 relativeDuration:.1 animations:^{
view.alpha = 0;
}];
} completion:nil];
} completion:nil];
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다