CAKeyframeAnimations를 사용하여 레이어의 transform.rotation
및 transform.translation.x
속성에 애니메이션을 적용했지만 암시 적으로 transform
속성에 애니메이션을 적용하는 데 문제가 있습니다. 두 상태 사이에 애니메이션을해야하는 레이어가 있고 CABasicAnimation의 기본 보간은 완전히 틀리며 원하는 경로를 따르지 않습니다. CAKeyframeAnimation 구조, 또는 그래서 나는 생각했다. transform
에 CAKeyframeAnimation을 사용하여 애니메이션을 적용하려고하면 다른 애니메이션이 실행되는 동안 뷰가 즉시 최종 변형에 스냅됩니다. 다음 함수의 첫 번째 절반을 제거하고 내 "변형"이벤트가 아래쪽의 CABasicAnimation을 사용하게하면 길게 따라 잘못 삽입 된 변형이 생깁니다.CAKeyframeAnimation으로 CATransform3D를 애니메이트하려면 어떻게해야합니까?
내 계층 대표는 구현 한 다음
- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if ([event isEqualToString:@"transform"])
{
CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
CGSize endSize = self.layer.bounds.size;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
animation.duration = 0.25;
NSMutableArray *values = [NSMutableArray array];
int stepCount = 10;
for (int i = 0; i < stepCount; i++)
{
CGFloat p = i/(float)(stepCount - 1);
CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
CATransform3D transform = [self transformForSize:size];
[values addObject:[NSValue valueWithCATransform3D:transform]];
}
animation.values = values;
return animation;
}
// All other animations use this basic animation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;
animation.duration = 0.25;
return animation;
}
변환 내
가 회전 다음에 번역,하지만 내 생각은 별도의 키 프레임 애니메이션이 번역을 통해 애니메이션과 회전 미친 초래 가진 그룹 애니메이션 도시. 나는 크기 & 변환이 내가 통과하는 p의 모든 값에 대해 정확하다는 것을 확인했다. 그리고 p는 0에서 1까지의 범위를 가진다.기본값이 아닌 타이밍 함수를 설정하려고 시도했지만 설정을 시도했다 타이밍 함수의 배열, 나는 keyImes를 생략했습니다, 나는 repeatCount를 0으로 설정했습니다. removedOnCompletion = YES와 forwardMill의 fillMode는 아무 효과가 없습니다. 변형 키 프레임 애니메이션을 올바르게 생성하지 않습니까?
성취하려는 정확한 효과를 분명히 할 수 있습니까? 당신은 회전으로 뒤 따르는 번역이라고 설명하지만, 코드에서 경계가 움직이는 것처럼 보입니다 - 맞습니까?이동/회전 애니메이션의 두 단계에서 연속적으로 경계가 커지거나 축소되는 레이어를 이동 한 다음 회전 시키시겠습니까? – GSnyder
암묵적인 이유가 무엇입니까? 이 코드는 해커처럼 보입니다. 세밀한 제어가 필요한 경우 왜 애니메이션을 만들어서 레이어에 직접 추가하는 것인가? 또한 기본 애니메이션을 사용하려는 경우 위임 메서드에서'nil'을 반환하면됩니다. –