これは、 Core Animationプログラミングガイドの「変換データ構造の変更」の例を除いて、直接文書化されていないものです。
リスト2の例はCATransform3D
、をパースペクティブ変換として構成する方法を示しています。
リスト 2CATransform3Dデータ構造を直接変更する
CATransform3D aTransform = CATransform3DIdentity;
// the value of zDistance affects the sharpness of the transform.
zDistance = 850;
aTransform.m34 = 1.0 / -zDistance;
何が起きてる?3D変換行列は4x4行列です(予想される3x3行列ではありません)。3行目の4列目(ゼロではなく1から数える)は、Z軸に沿った透視変換を制御します。「カメラ」からZ=0平面(画面と考えることができます)までの距離の負の逆数に設定します。
デフォルトでは、m34
はゼロです。これは、カメラから画面までの距離が無限大であることを意味します。無限遠では、すべての(有限の)ポイントがカメラから等距離にあるため、遠近法はありません。これは「正射影」と呼ばれます。
距離を小さい値(m34
大きくする)に設定すると、ますます強力な遠近法の投影が得られます。あなたはあなたが好きなものを見つけるために価値を試してみたいでしょう。
ほとんどのレイヤーは、サブレイヤーをZ=0平面に平坦化します。つまり、レイヤーに適用する透視投影はそのサブレイヤーには適用されず、すべてのサブレイヤーの変換を設定する必要があります。
ユーザーが特定のカードをタップできるようにする必要がない場合は、カードレイヤーをのサブレイヤーとして追加する必要がありますCATransformLayer
。AはそのサブレイヤーをZ=0平面に平坦化CATransformLayer
しないため、透視投影変換をにのみ適用できCATransformLayer
、個々のカードレイヤーに適用することを心配する必要はありません。ただし、CATransformLayer
はをサポートしていないためhitTest:
、タッチイベントによってどのカードがタッチされたかを簡単に判断することはできません。
CATransformLayerクラスリファレンス