8

これが明らかであるか、他の場所でカバーされている場合は申し訳ありませんが、私は一日中グーグルで検索しており、実際に機能する解決策を見つけていません.

私の問題は次のとおりです。現在、フルスクリーンの UIView で画像を描画しています。たとえば、画像が UIView の右下隅にあるとします。その画像の中心で回転変換(CGAffineTransformMakeRotation)を実行したいのですが、デフォルトでは、回転コマンドはUIView自体の中心を中心に回転します。その結果、回転すると、画像が所定の位置にとどまり、独自の中心を中心に回転するのではなく、画像が画面の周りを移動します。

私が収集したものから、原点(UIViewの中心)が画像の中心になるようにコンテキストを翻訳し、回転させてから、元の場所に翻訳してコンテキストを復元する必要があります。

以下は、私が作業した最も近いものですが、問題は、画像が回転している間、回転中に下に移動することです。これは、移動の開始点と終了点が同じになることに気付くのではなく、最初のステップの移動と 3 番目のステップの移動をアニメーションでトゥイーンすることが原因だと思います...

// Before this i'd make a call to a function that draws a path to a passed in context
CGAffineTransform inverseTranslation = CGAffineTransformMakeTranslation( transX, transY );
CGAffineTransform translation = CGAffineTransformMakeTranslation( -transX, -transY );
CGAffineTransform rot = CGAffineTransformMakeRotation( 3.14 );
CGAffineTransform final = CGAffineTransformConcat( CGAffineTransformConcat( inverseTranslation, rot ), translation );
// Then i apply the transformation animation like normal using self.transform = final etc etc

CGContextTranslateCTM や CGContextSaveGState/UIGraphicsPushContext なども試しましたが、ほとんど効果がないようです。

私はこれと何日も戦ってきましたが、現在の解決策は近いようですが、その翻訳トゥイーンを取り除く方法がわかりません。これに対する解決策、またはこれを行うためのより良い方法はありますか?

[更新]当分の間、UIviewの中心を中心にして画像を描画し、UIView.centerプロパティを回転させたい原点に設定してから、回転コマンドを実行しています。ちょっとしたハックのように思えますが、実際の翻訳が機能するようになるまでは、それが唯一の選択肢です。ありがとう!

4

4 に答える 4

14

duncanwilcox の答えは正しいものですが、ビューのレイヤーのアンカーを回転させたいポイントに変更する部分を省略しました。

CGSize sz = theview.bounds.size;
// Anchorpoint coords are between 0.0 and 1.0
theview.layer.anchorPoint = CGPointMake(rotPoint.x/sz.width, rotPoint.y/sz.height);
[UIView beginAnimations:@"rotate" context:nil];
theview.transform = CGAffineTransformMakeRotation( 45. / 180. * M_PI );
[UIView commitAnimations];

これはここに文書化されています: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

于 2009-06-01T20:30:32.283 に答える
7

これもオプションです: 基本の単純な変更 ;-)

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformTranslate(transform,-x,-y);

あなたが好きな回転中心はどこ(x,y)ですか

于 2012-04-22T22:42:06.210 に答える
2

回転は、ビューのレイヤーの anchorPoint を中心に発生します。anchorPoint のデフォルトは中心 (0.5, 0.5) であるため、移動なしで回転だけで十分です。

簡単なテストを行いましたが、これは私にとってはうまくいきます:

[UIView beginAnimations:@"rotate" context:nil];
self.transform = CGAffineTransformMakeRotation( 45. / 180. * 3.14 );
[UIView commitAnimations];
于 2009-03-27T12:27:21.170 に答える
1

アニメーションを発生させたくないが、新しい回転を設定するだけの場合は、これを使用できます。

CGFloat newRotation = 3.14f 

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.0]; // no tweening
CGAffineTransform transform = CGAffineTransformMakeRotation(newRotation);
self.transform = transform;
[UIView commitAnimations];

回転は、実際には UIView の中心で行われる必要があります。animationDuration をゼ​​ロに設定すると、トゥイーンが発生しないことが保証されます。

ただし、これを 1 秒間に 60 回行わないように注意してください。これらのツールを使用してゲームのようなアニメーションを作成するのは非常に魅力的です。この種のアニメーションは、フレームからフレームへのベースの「たくさんのスプライトがあちこちに飛んでいる」ゲームを正確に意図したものではありません。

そのために - そして私はその道をたどってきました - 行く唯一の方法は OpenGL です。

于 2009-03-27T13:05:02.280 に答える