web-dev-qa-db-ja.com

UIView / CALayerに複数の変換を適用する

UIViewとそれに対応するCALayerに複数の変換を適用することに問題はありますか?

具体的には、問題が発生することなく、CATransform3DをCGAffineTransformsと「組み合わせる」ことができますか?

また、別の変換変更を同時にアニメーション化しながら、一部の変換を直接設定することに問題はありますか?

これをどのように行うかについての「ルール」、またはこれに関するデザインパターンはありますか?

30
Corey Floyd

これは質問に完全に答える(または近づく)わけではないことを理解していますが、CGAffineTransformsのみを使用している場合は、CGAffineTransformConcat()を使用して複数の変換を組み合わせることができます。

これは、変換を適切に連結する限り、一部の変換がアニメーション化され、他の変換がアニメーション化されていない場合でも問題なく機能します。レイヤー変換も行っているときに、これがどのように機能するのかわかりません。

45
pix0r

pix0rは正しいですが、これについてさらに情報があります。 CGAffineTransformConcat()の公式ドキュメント

また、簡単な例を次に示します。

// Rotate 45 degrees
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180));
// Move to the left
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0);
// Apply them to a view
self.view.transform = CGAffineTransformConcat(translate, rotate);
36
whitehawk

構文はSwift 3&4でわずかに変更されました。@ whitehawkの答えの適応:

// Rotate 45 degrees
var rotate = CGAffineTransform(rotationAngle: 45 * (.pi / 180))
// Move to the left
var translate = CGAffineTransform(translationX: -50, y: 0)
// Apply them to a view
self.view.transform = translate.concatenating(rotate)
7
Justin Vallely