如何知道iPhone或iPad相机的视angular

在Android中,API提供了视angular:

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

iOS中有什么等价物? 我不想预先写这些值,因为它不灵活。

在这种情况下,我不完全确定“水平”和“垂直”是什么意思,但是我想到了两个计算,即关于“z”轴的旋转(即照片中水平的水平)以及如何它向前和向后倾斜(即围绕“x”轴旋转,即指向上或向下)。 你可以使用Core Motion来做到这一点。 只需将其添加到您的项目中 ,然后您可以执行如下操作:

  1. 确保导入CoreMotion标题:

     #import <CoreMotion/CoreMotion.h> 
  2. 定义几个类的属性:

     @property (nonatomic, strong) CMMotionManager *motionManager; @property (nonatomic, strong) NSOperationQueue *deviceQueue; 
  3. 启动运动pipe理器:

     - (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. 完成后,停止运动pipe理器:

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

我没有对这里的值做任何事情,但是可以将它们保存在类属性中,然后可以在应用程序的其他位置访问它们。 或者,您可以从这里将UI更新发送回主队列。 一堆选项。

由于这是iOS 5及更高版本,如果应用程序支持早期版本,您可能还想弱连接Core Motion,然后检查一切是否正常,如果没有,只是意识到你不会捕获方向的设备:

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

而且,如果您想知道我每秒十二次的相当随意的select,那么在“iOS事件处理指南”中 ,如果只是检查设备的方向,则build议10-20 /秒。