6

のシャドウ パスをアニメーション化していCALayerます。

フレームは正しくサイズ変更されますが、影は拡大縮小されません。

CGSize(20,20)代わりに、shadowPath を初期値に設定しても、影は最終的なサイズで開始し、アニメーション全体で保持されます。

[CATransaction begin];
[CATransaction setAnimationDuration: 0];
[CATransaction setDisableActions: TRUE];
    layer.frame = CGRectMake(0,0,10,10);
    layer.shadowPath = [UIBezierPath bezierPathWithRect:layer.bounds].CGPath;
[CATransaction commit];

[CATransaction begin];

    [CATransaction setValue:[NSNumber numberWithFloat:10] forKey:kCATransactionAnimationDuration];
    layer.frame = CGRectMake(0,0,20,20);
    layer.shadowPath = [UIBezierPath bezierPathWithRect:tile.bounds].CGPath;

[CATransaction commit];
4

2 に答える 2

9

最初は、ドロップ シャドウ付きの小さな正方形。

ss

ボタンを押すと四角と影が一緒に大きくなります。

ss

主なコードは次のとおりです。

[CATransaction begin];
[CATransaction setAnimationDuration:5.0];
CAMediaTimingFunction *timing = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[CATransaction setAnimationTimingFunction:timing];
layer.frame = CGRectMake(0,0,100,100);
[CATransaction commit];    

CABasicAnimation *shadowAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
shadowAnimation.duration = 5.0;
shadowAnimation.fromValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50, 50)].CGPath;
shadowAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)].CGPath;
[layer addAnimation:shadowAnimation forKey:@"shadow"];

このプロジェクトは GitHub からダウンロードして実行できます。

https://github.com/weed/p120812_CALayerShadowTest

この質問は私にはとても難しかったです!:)

于 2012-08-12T04:06:14.133 に答える
3

Weedの回答に基づいて別の回答を追加したかった. 複数のレイヤーをアニメーション化し、アニメーションが一緒に発生することを確認したかったので、雑草の答えを取り、すべてを CATransaction に入れようとしました。必要に応じてどうぞ。また、CATransaction で fromValue と toValue を使用する必要がある理由もまだわかりません。フレームのような他のプロパティで行うのと同じことができないのはなぜですか。

[CATransaction begin];

[CATransaction setValue:[CAMediaTimingFunction
    functionWithName:kCAMediaTimingFunctionEaseOut]
    forKey:kCATransactionAnimationTimingFunction];

for (CALayer *layer in self.layers){
    CABasicAnimation *shadowAnimation =
    [CABasicAnimation animationWithKeyPath:@"shadowPath"];

    shadowAnimation.fromValue =
        (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath;
    shadowAnimation.timingFunction =
        [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    layer.frame = rectFinal;
    shadowAnimation.toValue =
        (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath;
    layer.shadowPath =
        [UIBezierPath bezierPathWithRect:layer.bounds].CGPath;
    [layer addAnimation:shadowAnimation forKey:nil];
}         
[CATransaction commit];
于 2012-08-13T18:18:02.483 に答える