3

Android では、API は視野角を提供します。

  1. Camera.Parameters.getHorizontalViewAngle()
  2. Camera.Parameters.getVerticalViewAngle()

iOSで同等のものは何ですか? 柔軟性がないため、これらの値を事前に書きたくありません。

4

2 に答える 2

1

この文脈で「水平」と「垂直」が何を意味するのかは完全にはわかりませんが、「z」軸を中心とした回転(つまり、写真の水平線との高さ)と、どのようにかなり前後に傾いています (つまり、「x」軸を中心とした回転、つまり上向きか下向きか)。これはCore Motionを使用して行うことができます。プロジェクトに追加するだけで、次のようなことができます。

  1. CoreMotion ヘッダーを必ずインポートしてください。

    #import <CoreMotion/CoreMotion.h>
    
  2. いくつかのクラス プロパティを定義します。

    @property (nonatomic, strong) CMMotionManager *motionManager;
    @property (nonatomic, strong) NSOperationQueue *deviceQueue;
    
  3. モーション マネージャを起動します。

    - (void)startMotionManager
    {
        self.deviceQueue = [[NSOperationQueue alloc] init];
        self.motionManager = [[CMMotionManager alloc] init];
        self.motionManager.deviceMotionUpdateInterval = 5.0 / 60.0;
    
        [self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical
                                                                toQueue:self.deviceQueue
                                                            withHandler:^(CMDeviceMotion *motion, NSError *error)
        {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                CGFloat x = motion.gravity.x;
                CGFloat y = motion.gravity.y;
                CGFloat z = motion.gravity.z;
    
                // how much is it rotated around the z axis
    
                CGFloat rotationAngle = atan2(y, x) + M_PI_2;                  // in radians
                CGFloat rotationAngleDegrees = rotationAngle * 180.0f / M_PI;  // in degrees
    
                // how far it it tilted forward and backward
    
                CGFloat r = sqrtf(x*x + y*y + z*z);
                CGFloat tiltAngle = (r == 0.0 ? 0.0 : acosf(z/r);              // in radians
                CGFloat tiltAngleDegrees = tiltAngle * 180.0f / M_PI - 90.0f); // in degrees
            }];
        }];
    }
    
  4. 完了したら、モーション マネージャーを停止します。

    - (void)stopMotionManager
    {
        [self.motionManager stopDeviceMotionUpdates];
        self.motionManager = nil;
        self.deviceQueue = nil;
    }
    

ここでは値に対して何もしていませんが、値をクラス プロパティに保存して、アプリの他の場所にアクセスできます。または、UI の更新をここから直接メイン キューにディスパッチすることもできます。たくさんのオプション。

これは iOS 5 以降であるため、アプリが以前のバージョンをサポートしている場合は、Core Motion を弱くリンクしてから、すべてが問題ないことを確認してください。そうでない場合は、向きをキャプチャしないことに注意してください。デバイスの:

if ([CMMotionManager class]) 
{
    // ok, core motion exists
}

また、1 秒あたり 12 回という私のかなり恣意的な選択について疑問に思っている場合のために、iOS のイベント処理ガイドでは、デバイスの向きを確認するだけであれば 10 ~ 20 回 / 秒を提案しています。

于 2013-05-15T02:25:55.890 に答える