2

お絵描きアプリをやっています。

ユーザーが画面に図形を「ドロップ」してから、必要に応じて移動、サイズ変更、または回転できるようにしたいと考えています。

問題は回転にあります。移動とサイズ変更が正常に機能しています。

以前はかなり複雑でメモリ/プロセッサを集中的に使用するプロセスでこれを行っていましたが、現在はこれを改善しようとしています。

検索して検索しましたが、私がやろうとしていることに似た答えが見つかりませんでした。

基本的に、ユーザーが「表面」に正方形を落としたとしましょう。次に、それをタップしてハンドルを取得します。任意の場所をタッチしてパンして四角形を動かしたり (既に機能しています)、サイズ変更ハンドルをタッチ アンド ドラッグして四角形のサイズを変更したり (既に機能しています)、回転ハンドルをつかんで四角形をその中心を中心に回転させたりすることができます。

UIBezierPath を使用して正方形を描画するか、塗りつぶした UIView のサブクラスにすることを検討しました。

どちらの場合も、内部の一部のコンテンツではなく、UIView 自体を回転させようとしています。ビューを回転しようとするたびに、何も起こらないか、ビューが画面から空になるか、少しだけ回転して停止します。

これが私が試したコードの一部です(これは機能せず、これに対してさまざまなアプローチを試みました):

- (void) rotateByAngle:(CGFloat)angle
{

CGPoint cntr = [self center];

CGAffineTransform move  = CGAffineTransformMakeTranslation(-1 * cntr.x, -1 * cntr.y);
[[self path] applyTransform:move];

CGAffineTransform rotate = CGAffineTransformMakeRotation(angle * M_PI / 180.0);
[[self path] applyTransform:rotate];

[self setNeedsDisplay];
CGAffineTransform moveback = CGAffineTransformMakeTranslation(cntr.x, cntr.y);
[[self path] applyTransform:moveback];

}

明らかでない場合、ここではビューを原点 (0,0) に移動し、その点を中心に回転してから元に戻すという考え方です。

ご参考までに、「角度」は正しく計算されています。また、上記のコードを[UIView beginAnimations:nil context:NULL]/[UIView commitAnimations]ブロックで囲みました。

UIView を「カスタム」量回転させることは可能ですか? 以前に、コントロールを回転するようにアニメーション化するところを見たり実行したりしたことがありますが、これらの例では、コントロールは常に「正方形」になりました (つまり、1 つ以上の完全な円を回転させて、最初の向きに戻りました)。

UITouches に応答してこのローテーションを「リアルタイム」で実行することは可能ですか? UIView のレイヤーのアイテムとして正方形を描画し、代わりにレイヤーを回転させる必要がありますか?

ご存知のように、私が以前に取り組んでいたのは、一連の線または で描かれた形状でしたUIBezierPaths。データに を適用してCGAffineTransformから、drawRect: メソッドを呼び出します。これにより、カスタム UIView 内のオブジェクトが再描画されます。この UIView は、これらのアイテムのかなりの数をホストし、それらのいずれかが必要になるたびに、それらすべてを再描画する必要があります。

そのため、ユーザーが何かを行ったときにのみ再描画するコマンドを取得する一連の UIView サブクラスを作成して、アプリのパフォーマンスを向上させようとしています。追加された形状を回転させるには 2 本の指を使用する必要があるため、iPad 用の Apple の Keynote は UIGestureRecognizers を使用してこれを実現しているようです。これは行く方法ですか?

考え?

ありがとう!

4

2 に答える 2

4
-(void)rotate{
    CGAffineTransform transform;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationOptionBeginFromCurrentState];
    myView.alpha = 1;
    transform = CGAffineTransformRotate(myView.transform,0.5*M_PI);
    [myView setUserInteractionEnabled:YES];
    myView.transform = transform;
    [UIView commitAnimations];
}

これは役立つかもしれません。

于 2011-01-17T12:46:01.643 に答える
1

単純な回転だけを行うには、アニメーションを省略できます。

-(void)rotate:(CGFloat)angle
{
    CGAffineTransform  transform = CGAffineTransformRotate( myView.transform, angle * M_PI / 180.0 );
    myView.transform = transform;
}

単純な NSTimer を使用してアニメーションを制御します。

于 2012-02-29T15:47:27.673 に答える