使用 iOS 中的传感器检测面朝上的位置

Detect face up position with sensors in iOS

我想用传感器信息检测面朝上的位置。如果 iPhone 的位置是面朝上的,屏幕上名为 btnOpen 的按钮应该是可见的,否则按钮应该是隐藏的。 我正在检查 z 值和间隔 [-0.8,-1.0] Z 值是否正确更改但 btnOpen.hidden = YES or NO 第一次工作然后不工作。我创建了一个标签来在屏幕上打印 z 值,但它首先写入 z 值并且该值没有改变。 问题是什么 ?我该如何解决这个问题?

NSOperationQueue *theQueue = [[NSOperationQueue alloc] init];

    returnedData = [[CMAccelerometerData alloc] init];
    motionManager = [[CMMotionManager alloc] init];

    [motionManager startAccelerometerUpdatesToQueue:theQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {

        returnedData = motionManager.accelerometerData;

        float z = returnedData.acceleration.z;

        NSLog(@"Z: %f", z);

        if(z > -1.0 && z < -0.8 ){
            btnOpen.hidden = NO;
        }
        else{
            btnOpen.hidden = YES;
        }
- (void)viewDidLoad {
   [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]];
}


- (void)orientationChanged:(NSNotification *)note{
   UIDevice * device = note.object;
   //  NSLog(@"rotation main %d ",device.orientation;);

  switch(device.orientation){
    case 1:
        //Portrait
    break;

    case 4:
       //landscape right
    break;

    case 3:
        //landscape left
    break;

    default:
        //other orientations
    break;
   };
}

我使用 Scheduled Timer 解决了这个问题。下面每 0.5 秒调用一次方法并正常工作。

- (void)viewDidLoad {
    [super viewDidLoad];

    theQueue = [[NSOperationQueue alloc] init];

    returnedData = [[CMAccelerometerData alloc] init];
    motionManager = [[CMMotionManager alloc] init];
    [NSTimer scheduledTimerWithTimeInterval:0.5f
                                     target:self selector:@selector(checkPhonePosition:) userInfo:nil repeats:YES];

}


-(void)checkPhonePosition:(NSTimer *)timer {


    [motionManager startAccelerometerUpdatesToQueue:theQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {

        returnedData = motionManager.accelerometerData;

        z = returnedData.acceleration.z;

        NSLog(@"Z: %f", z);


    }];

    if(z > -1.0 && z < -0.8 ){
        btnOpen.hidden = NO;
    }
    else{
        btnOpen.hidden = YES;
    }
}