使用 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;
}
}
我想用传感器信息检测面朝上的位置。如果 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;
}
}