UIView でパースペクティブ変換を実行しようとしています (coverflow に見られるような)
これが可能かどうか誰にもわかりますか?
私はCALayer
すべての実用的なプログラマー Core Animation ポッドキャストを使用して調査し、実行しましたが、iPhone でこの種の変換を作成する方法についてはまだ明確ではありません。
ヘルプ、ポインタ、またはサンプル コード スニペットをいただければ幸いです。
UIView でパースペクティブ変換を実行しようとしています (coverflow に見られるような)
これが可能かどうか誰にもわかりますか?
私はCALayer
すべての実用的なプログラマー Core Animation ポッドキャストを使用して調査し、実行しましたが、iPhone でこの種の変換を作成する方法についてはまだ明確ではありません。
ヘルプ、ポインタ、またはサンプル コード スニペットをいただければ幸いです。
ベンが言ったようにUIView's
、を使用してレイヤーCATransform3D
を操作する必要がありlayer's
rotation
ます。here で説明されているように、パースペクティブを機能させるための秘訣cells
は、CATransform3D
(m34)のマトリックスの 1 つに直接アクセスすることです。行列の計算は私の趣味ではなかったので、これがうまくいく理由を正確に説明することはできませんが、うまくいきます。最初の変換では、この値を負の割合に設定してから、レイヤーの回転変換をそれに適用する必要があります。次のこともできるはずです。
Objective-C
UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;
スイフト5.0
if let myView = self.subviews.first {
let layer = myView.layer
var rotationAndPerspectiveTransform = CATransform3DIdentity
rotationAndPerspectiveTransform.m34 = 1.0 / -500
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0 * .pi / 180.0, 0.0, 1.0, 0.0)
layer.transform = rotationAndPerspectiveTransform
}
これにより、回転ごとにレイヤー変換が最初から再構築されます。
この完全な例 (コード付き) は、こちら にあります。ここCALayers
では、Bill Dudney の例に基づいて、いくつかの にタッチベースの回転とスケーリングを実装しました。ページの一番下にあるプログラムの最新バージョンは、この種のパースペクティブ操作を実装しています。コードはかなり読みやすいものにする必要があります。
sublayerTransform
応答で参照する は、 のサブレイヤーに適用される変換ですUIView's
CALayer
。サブレイヤーがない場合でも、心配する必要はありません。この例で sublayerTransform を使用しているのは、単純に、CALayers
回転させている 1 つのレイヤー内に 2 つのレイヤーが含まれているからです。
UIView の transform プロパティに直接適用される Core Graphics (Quartz、2D のみ) 変換のみを使用できます。coverflow で効果を得るには、3D 空間に適用される CATransform3D を使用する必要があります。これにより、必要な透視図が得られます。ビューではなくレイヤーにのみ CATransform3D を適用できるため、これにはレイヤーに切り替える必要があります。
Xcode に付属の「CovertFlow」サンプルを確認してください。これは Mac 専用です (つまり、iPhone 用ではありません) が、多くの概念がうまく反映されています。