1. ホーム
  2. ios

[解決済み] UIViewに透視変換を適用するにはどうすればよいですか?

2022-04-21 20:09:21

質問

UIViewに対して透視変換を行いたい(coverflowで見られるような)。

このようなことが可能かどうか、どなたかご存知でしょうか?

を使うことを検討しました。 CALayer しかし、iPhoneでこの種のトランスフォームを作成する方法については、まだよく分かっていません。

どんなヘルプ、ポインタ、サンプルコードでも結構です。

どのように解決するのですか?

ベンが言ったように、あなたは UIView's レイヤーを使用し CATransform3D を実行します。 layer's rotation . として、遠近法を動作させるためのトリックは ここに記載されている の1つに直接アクセスすることです。 cellsCATransform3D (m34). 行列の計算は苦手なので、なぜこれがうまくいくのか正確に説明することはできませんが、うまくいくのです。 この値を負の分数に設定して、最初の変換を行い、それにレイヤーの回転変換を適用する必要があります。 また、次のようなこともできるはずです。

オブジェクト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;

Swift 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を使用しているのは、単に2つの CALayers 回転させる1つのレイヤーの中に含まれています。