5

ここに私のアニメーションコードがあります:

CGFloat zDistance = 850;
CGFloat scaleFactor = BACK_COVER_WIDTH / self.transformLayer.bounds.size.width;
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0);
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0);
CATransform3D transform = CATransform3DConcat(rotation, scale);
transform.m34 = 1.0 / -zDistance;
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame));
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
self.transformLayer.transform = transform;
self.transformLayer.position = location;
[CATransaction commit];

self.transformLayer1 つはCATransformLayer前面用、もう 1 つは背面用です (「フリップ」効果を作成しています)。ただし、このコードはアニメーションなしで位置と変換を設定するだけです。暗黙的なアニメーションをサポートしていないのではないかと思ったtransformので、それを取り出して位置を設定しようとしましたが、どちらもアニメーション化されませんでした (position暗黙的なアニメーションをサポートしていることは確かです)。

何か間違ったことをしているのですか、それともCATransformLayer暗黙のアニメーションをサポートしていないだけですか? ドキュメントには、サポートしていないことについては何も書かれていないので、サポートしていると思います。

編集:これはiOSではなくMac OS X用です

4

4 に答える 4

1

私は明示的なアニメーションを使用するだけになりましたが、ここでの David Duncan の回答は、この問題に遭遇した他の人にとって正しい方向への一歩のようです。

于 2011-03-18T20:45:29.983 に答える
0

に関連付けられたすべてのレイヤで暗黙的なアニメーションが無効になりますUIView。詳細に興味がある場合は、別の質問にもっと詳細な回答があります。しかし要するに、ビューに関連付けられたレイヤーにアニメーションが必要な場合は、アニメーションを明示的に行う必要があります (つまり、CAAnimationを使用してオブジェクトをアタッチします-addAnimation:forKey:)。

編集:この質問はOS X向けであり、CATransformLayerは実際にはサブレイヤーであることが判明しました。この回答は無視してください (ただし、リンクされた回答は引き続き iOS に役立ちます)。

于 2011-02-08T05:30:59.143 に答える
0

のサブレイヤーのみCATransformLayerがレンダリングされます。だから私の推測では、そのtransformプロパティは決して適用されません。sublayerTransform代わりにプロパティを設定してみましたか? とにかくそれを目指しているようです。

于 2011-02-12T19:08:41.270 に答える
0

レイヤーを追加して同じ実行ループでアニメーション化しようとしても、アニメーションは発生しません - 即座に発生します。レイヤーを CATransaction に追加してラップする必要があります。その後、暗黙的または明示的にアニメーション化できます。たとえば、これはうまくいくはずです:

[CATransaction begin];
[self.view.layer addSublayer:transformLayer];
[CATransaction commit];

// implicit animation will now occur because we're in the next run loop
transformLayer.transform = newTransform;
于 2013-02-14T19:36:50.237 に答える