我已經使用CAKeyframeAnimations爲圖層的transform.rotation
和transform.translation.x
屬性設置動畫效果,但我無法隱式動畫設置transform
屬性。我有一個必須在兩個狀態之間動畫的圖層,而CABasicAnimation的默認插值完全不正確,並且不遵循我想要的路徑。 CAKeyframeAnimation來拯救,或者我想。任何使用CAKeyframeAnimation動畫transform
的嘗試都會導致該視圖在其他動畫運行時立即捕捉到最終變換。如果我刪除了以下函數的前半部分,並讓我的「變形」事件在底部使用了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.
我試過設置非默認定時功能,我試過設置一組定時函數,我省略了關鍵時間,我設置了一個0的重複計數,removedOnCompletion = YES,以及一個fillMode的轉發並且沒有任何效果。我沒有正確創建變換關鍵幀動畫?
你能否澄清你試圖達到的確切效果?你將它描述爲一個翻譯後跟一個旋轉,但是從你的代碼看,它的邊界也是動畫 - 這是否正確?您希望圖層移動,然後旋轉,邊界在移動/旋轉動畫的兩個階段中不斷增大或縮小? – GSnyder 2012-03-11 01:01:41
它爲什麼需要隱含?這段代碼看起來很拙劣。如果你想細粒度的控制,爲什麼不創建動畫並直接將其添加到圖層,你說你已經工作了?如果你想要使用默認動畫,只需從該委託方法返回'nil'即可。 – 2012-03-12 01:08:48