デバイスの向きに関係なく、uiviewを特定の方向に向け続ける方法は?
-
28-10-2019 - |
質問
私はいつも対決したいというuiviewを持っています。したがって、矢印があるuiimageViewがあるとし、デバイスがどのように保持されていても、それが指摘されているとします。明らかに加速度計が必要ですが、座標に基づいて画像を回転させるように指示することは、回転が相対的であるため、初めてうまくいくのです。これを行う簡単な方法はありますか?このようなことをするどこかに簡単な例アプリがあると感じています。
解決
Appleには、必要なものを正確に行うサンプルコードがあります。これを見てください: http://developer.apple.com/library/ios/#samplecode/whichwayisup/introduction/intro.html
特定のモーションデータを受信するには、の共有インスタンスを使用します UIAccelerometer
そして、それは代表です。 http://developer.apple.com/library/ios/documentation/uikit/reference/uiaccelerotoremerdelegate_protocol/uiaccelerotoremoterdelegate/uiaccelerotoremerdelegate.html#/apple_ref/occ/intf/uiaccelerometherdelegate
回転に関する限り、私はよくわかりません。こちらの「bubblelevelevel」サンプルコードをご覧ください。 http://developer.apple.com/library/ios/samplecode/bubblelevel/introduction/intro.html#//apple_ref/doc/uid/dts40007331
アクセルメーターの委任ドキュメントには、それとその他の関連するサンプルコードが参照されます。
他のヒント
whithwayisup あなたが探しているサンプルアプリケーション - iOSリファレンスライブラリ(素晴らしいドキュメント!)
ビューに適用される変換は累積的ではありません。むしろ、ビューは親の座標系に整合し始め、変換はそれに対して適用されます。
他の答えが暗示しているように、Appleに十分な部分があります BubbleLevelサンプルコード あなたが探していることを達成するために。 -[LevelViewController accelerometer:didAccelerate:]
既に、重力ベクトルの平滑化されたスクリーン関連回転成分を抽出する方法の例が含まれています。
// Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
accelerationX = acceleration.x * kFilteringFactor + accelerationX * (1.0 - kFilteringFactor);
accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor);
// keep the raw reading, to use during calibrations
currentRawReading = atan2(accelerationY, accelerationX);
の座標系が与えられます uiacceleration と atan2, 、あなたのビューの望ましい回転を計算するために留意する必要があるいくつかの要因があります:
- デバイスがポートレートで直立しているとき、
atan2
入力重力ベクトルは{0.0、-1.0、0.0}であるため、-π/2(-90°)を返します。 CGAffineTransformMakeRotation
指定されたラジアンの数によって時計回りに(iOSで)回転する変換を作成しますが、atan2
反時計回りの回転を指定します。
したがって、その親ビューがポートレートの画面で方向に向けられていると仮定して、あなたのビューを - (currentRawReading +π/2)で回転させたいと思うでしょう。
view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));