2010-08-20 41 views
4

我有一個CALayer A與一個子圖層B 我希望A被調整大小(縮小),所以我添加動畫到我的圖層A ,但是當我提交動畫子圖層B是不縮水。它的大小保持不變(但它的位置隨着超級範圍的變化而改變) 如何讓我的B圖層與A動畫一起調整大小?調整圖層和它的子圖層 - CoreAnimation

這是我寫的:

CABasicAnimation *fadeInAnimation; 
fadeInAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.repeatCount = 1; 
fadeInAnimation.autoreverses = NO; 
fadeInAnimation.fromValue = [NSNumber numberWithFloat:1.0]; 
fadeInAnimation.toValue = [NSNumber numberWithFloat:0.0]; 

CABasicAnimation *shrinkAnimation; 
shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"]; 
shrinkAnimation.repeatCount = 1; 
shrinkAnimation.autoreverses = NO; 
shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
shrinkAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0, 0)]; 

aniGroupOFF = [[CAAnimationGroup animation] retain]; 
aniGroupOFF.delegate = self; 
aniGroupOFF.duration = ANI_DURATION; 
aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, fadeInAnimation, nil]; 

而且承諾:

[self addAnimation:aniGroupOFF forKey:@"shrinkAndFade"]; 
self.opacity = 0.0; 

答:

CABasicAnimation *shrinkAnimation; 
    shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; //use transform instead of bounds.size 
    shrinkAnimation.repeatCount = 1; 
    shrinkAnimation.autoreverses = NO; 
    shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    shrinkAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(self.transform, 0.1, 0.1, 1.0)]; 

    aniGroupOFF = [[CAAnimationGroup animation] retain]; 
    aniGroupOFF.delegate = self; 
    aniGroupOFF.duration = ANI_DURATION; 
    aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, nil]; 
+0

答案可能有效,但您甚至可以爲「transform.scale」設置動畫效果,並使用簡單的NSNumber作爲值。這就是我在回答中所談論的內容。 – tonklon 2010-08-20 10:51:41

回答

7

實現這一目標最簡單的方法是將動畫的keyPath 「transform.scale」而不是「bounds.size」。

如果你堅持使用「bounds.size」,你需要在A的代表上實現layoutSublayers,或者在A的代理上實現layoutSublayersOfLayer:(CALayer*)aLayer,並在該實現中手動調整B的大小。

+0

謝謝,我會嘗試transform.scale,但有一件有趣的事情:我寫了[layer setNeedsDisplayOnBoundsChange:YES];並覆蓋layoutSublayer並嘗試調整子圖層的邊界/框架,但layoutSublayer僅在初始化時調用。因此,子圖層不會縮小。 – nacho4d 2010-08-20 08:32:50

+0

您是否在A層或B層實現了layoutSublayers?應該是A.我不明白爲什麼layoutsublayers不應該被稱爲邊界動畫時。 – tonklon 2010-08-20 10:49:57