2010-08-27 63 views
4

我想在UIView類別上的這個代碼(在這裏回答中找到),並使用它來執行嵌套在UITableViewCell內的UIImageView的「流行」動畫。UIImageView正在消失後CAKeyframeAnimation

- (void)attachPopUpAnimation 
{ 
    CAKeyframeAnimation *animation = [CAKeyframeAnimation 
     animationWithKeyPath:@"transform"]; 

    CATransform3D scale1 = CATransform3DMakeScale(0.5, 0.5, 1); 
    CATransform3D scale2 = CATransform3DMakeScale(1.2, 1.2, 1); 
    CATransform3D scale3 = CATransform3DMakeScale(0.9, 0.9, 1); 
    CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1); 

    NSArray *frameValues = [NSArray arrayWithObjects: 
     [NSValue valueWithCATransform3D:scale1], 
     [NSValue valueWithCATransform3D:scale2], 
     [NSValue valueWithCATransform3D:scale3], 
     [NSValue valueWithCATransform3D:scale4], 
     nil]; 
    [animation setValues:frameValues]; 

    NSArray *frameTimes = [NSArray arrayWithObjects: 
     [NSNumber numberWithFloat:0.0], 
     [NSNumber numberWithFloat:0.5], 
     [NSNumber numberWithFloat:0.9], 
     [NSNumber numberWithFloat:1.0], 
     nil];  
    [animation setKeyTimes:frameTimes]; 

    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    animation.duration = 0.2; 

    [self.layer addAnimation:animation forKey:@"popup"]; 
} 

該動畫可以正常工作,但完成後會消失。我已經找到了解決這個問題的其他人的答案,但顯然在這種情況下設置fillMode不起作用。

回答

11

請勿使用這兩行。相反,實際上在圖層上設置了轉換。與最終變換狀態

animation.fillMode = kCAFillModeForwards; 
animation.removedOnCompletion = NO; 

::替換這兩行

[[self layer] setTransform:scale4]; 

當設置填充模式向前和不去除動畫,它導致最終狀態是視覺僅。你需要實際改變你的動畫屬性的圖層內部狀態。爲此,在將動畫添加到圖層時,通過使用轉換名稱來覆蓋transform屬性的動畫。這將導致動畫使用您的動畫而不是默認值。

[[self layer] addAnimation:animation forKey:@"transform"]; 
+0

這是排課嗎? '[[self layer] setTransform:[NSValue valueWithCATransform3D:scale4]];'拋出語法錯誤,說'沒有可行的從NSValue到CATransform3D的轉換'。當設置fromValue和toValue時,只能使用NSValue包裝? – Echelon 2015-04-17 10:14:03

+0

確實。不知道如何不被忽視這麼久。謝謝。現在修復。 – 2015-04-18 17:09:21