逆Y軸の視点で平行移動マトリックスを処理する方法
-
03-07-2019 - |
質問
私のユーザーケースは、画像の縮尺、回転、平行移動のアニメーションを行うiphoneアプリケーションです。
だから、私はすべてを連結し、transformプロパティにフィードしますが、1つの問題があります:
画像のサイズはさまざまなので、画像を正しく配置するのは問題です。私は逆のy軸座標系に慣れているので、画像をy軸の60ピクセルに正確に配置したいです。
では、元のデカルトy軸から逆y軸の視点に変更するにはどうすればよいですか
解決
smaclが指摘しているように、これを行う最も簡単な方法は、ビューの原点でyの代わりに(screenheight-viewheight-y)を使用して、画面の左下に原点を移動することです。
ただし、CATransform3Dを使用して、メインビューのレイヤーの座標系を反転できます。これは、iPhoneアプリケーションとMacクライアント間で同じCore Animation CALayerレイアウトコードを共有できるようにするためです(iPhoneはCALayersの通常のQuartz座標系を反転させてUIViewsの座標系に一致させます)。これを有効にするために必要なことは、行を配置することです
self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);
レイヤーホスティングUIViewの初期化コード。これによりCALayersが反転するため、これらのレイヤーでのUIKitテキストレンダリングも、次のようなコードを使用して反転する必要があります。
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];
CGContextRestoreGState(context);
CGAffineTransformを使用して同様の種類の反転を行うことができますが、翻訳を適用して機能させる必要があります。
CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);
アフィン変換を使用して、CGPointApplyAffineTransform()を使用して原点座標を変換できる場合があります。
他のヒント
y座標ごとに、y = top-y、topは描画する境界ボックスの上部のy座標です。