2

アプリケーションの 1 つで CALayers を使用して 3D スタイルの効果を作成しようとしています。ただし、ネストされた CALayer にはパースペクティブが適用されていないようです。

疑似コードで説明するために、パースペクティブが適用されたレイヤーがある場合、次のようにします。

CATransform3D subLayerTransform = CATransform3DIdentity;

/* set perspective */
subLayerTransform.m34 = -0.002;
superLayer.sublayerTransform = subLayerTransform;

追加してから、次のようにレイヤーを追加します。

CALayer *sublayer = [CALayer layer];
sublayer.frame = layerFrame;
sublayer.contents = (id)[image CGImage];
[superLayer addSublayer: sublayer];

パースペクティブは期待どおりに適用されます。ただし、レイヤーをさらにネストしようとすると

CALayer *sublayer = [CALayer layer];
[superLayer addSublayer: sublayer];

CALayer *nestedlayer = [CALayer layer];
nestedlayer.frame = layerFrame;
nestedlayer.contents = (id)[image CGImage];
[sublayer addSublayer: nestedlayer];

ネストされたレイヤーは、回転するとフラットになります。

あたかも、スーパーレイヤーがレイヤー階層でその直下にあるレイヤーにのみ変換を適用するかのようです。これは事実ですか?それとも私は何か間違ったことをしていますか?

4

1 に答える 1

2

秘訣は、サブレイヤーとして CATransformLayer を使用することです。

このレイヤーは実際には何も「表示」しないため、従来の CALayer を CATransformLayer の子として追加して、コンテンツを表示するジョブを実行する必要があります。しかし、それが行うことは、オブジェクトの座標空間を維持し、適切な変換をその子レイヤーに適用するという優れた仕事です。

于 2010-03-10T13:04:19.143 に答える