2

次のコードを使用して、加速度計の値で画面を上下に移動するように設定されたUIImageViewがあります。

ship.center = CGPointMake(ship.center.x, ship.center.y+shipPosition.y);

shipPosition以下を使用してaccelerometerDidAccelerateメソッドで設定されたCGPointはどこにありますか。

shipPosition.y = acceleration.x*60;

明らかにこれはうまく機能します、それは非常に簡単です。同じように単純なことをしようとすると、問題が発生します。画像の回転を加速度に応じて変化させます。私はこれを使用して行います:

ship.transform = CGAffineTransformMakeRotation(shipPosition.y);

何らかの理由で、これは非常に奇妙なことを引き起こします。つまり、mainメソッドが呼び出されるたびに、画像が元の場所にスナップバックします。画像が本来あるべき位置に移動するフレームを見ることができますが、すぐに元に戻ります。

この問題は、回転線が入っている場合にのみ発生し、コメントアウトすると正常に機能します。ここで何が起こっているのかわかりません。さまざまなアプリでこれを何度も実行しましたが、このような問題は発生しませんでした。実際、私は自分が作成した別のアプリからコードをコピーしました。

編集:

が本当に混乱しているのは、回転角度を加速から船の位置に変更するときです。

ship.transform = CGAffineTransformMakeRotation(ship.center.y/10);

これを行うと、船は実際には加速度計に基づいて回転しますが、移動しません。これはship.center.y、船の位置が変化していることを意味するため、クレイジーですが、そうではありません!!

4

2 に答える 2

1

中心座標またはフレームを設定 する前に、ビューの変換を元に戻し、その後、新しい変換を適用する必要があります。CGAffineTransformIdentity

ビューが変換され、真の(実際には変換された真の)座標 ではない場合、frameプロパティはビューの変換された座標を返します。

ドキュメントからの引用:

警告:変換プロパティがID変換でない場合、このプロパティの値は未定義であるため、無視する必要があります。


更新/実際の回答:
実際の問題は

shipPosition.y = acceleration.x*60;

y位置をで設定したのでaccelerometerDidAccelerate
古い値を覚えていaccelerationません。したがって、デバイスを移動するとピークになり、速度を落とすと再び減速します。

船は最高加速速度で+/-60になりますが、デバイスの移動を停止すると0になり、0にshipPosition.yなります。

于 2013-01-11T10:55:11.393 に答える
0

CGAffineTransformMakeRotationは、角度を度ではなくラジアンで期待します。

1ラジアン=M_PI/180.0度

于 2013-01-11T04:24:49.817 に答える