199

UIView でパースペクティブ変換を実行しようとしています (coverflow に見られるような)

これが可能かどうか誰にもわかりますか?

私はCALayerすべての実用的なプログラマー Core Animation ポッドキャストを使用して調査し、実行しましたが、iPhone でこの種の変換を作成する方法についてはまだ明確ではありません。

ヘルプ、ポインタ、またはサンプル コード スニペットをいただければ幸いです。

4

4 に答える 4

332

ベンが言ったように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 つのレイヤーが含まれているからです。

于 2008-12-09T17:44:06.250 に答える
7

UIView の transform プロパティに直接適用される Core Graphics (Quartz、2D のみ) 変換のみを使用できます。coverflow で効果を得るには、3D 空間に適用される CATransform3D を使用する必要があります。これにより、必要な透視図が得られます。ビューではなくレイヤーにのみ CATransform3D を適用できるため、これにはレイヤーに切り替える必要があります。

Xcode に付属の「CovertFlow」サンプルを確認してください。これは Mac 専用です (つまり、iPhone 用ではありません) が、多くの概念がうまく反映されています。

于 2008-12-07T17:43:09.590 に答える