在iOS中使用Accelerometer需要帮助

时间:2012-12-05 17:21:25

标签: ios avaudioplayer accelerometer

我正在开发一款应用程序,可以为用户持有iOS设备的每个位置发出蜂鸣声(站立,躺在其正面/背面或侧面)。此刻,当用户将设备放在一边时,我能够播放声音,但问题是因为我将加速度计值与滑块相关联,所以哔哔声是连续的(即它播放声音为只要用户将设备放在其侧面,而不是仅仅一次。

我希望用户只需将设备稳稳地放在侧面,然后发出一声嘟嘟声,然后让用户依次将设备保持在其他位置,并等待另一声嘟嘟声。我希望用户一步一步地将设备一次一个地放在每个位置,只有在听到哔哔声后才能移动到下一个位置。

以下是我正在使用的代码:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{

    NSLog(@"(%.02f, %.02f, %.02f)", acceleration.x, acceleration.y, acceleration.z);
    slider.value = acceleration.x;

    if (slider.value == -1)
        [self pushBeep];

    else if (slider.value == 0.00)
        [self pushBap];

    else if (slider.value == 1)
        [self pushBop];

...

这是我的pushBeep()方法的代码(仅供参考,方法pushBeep / pushBap / pushBop都是相同的):

-(void) pushBeep {

    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"beep-7" ofType:@"wav"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];

    NSError *ierror = nil;
    iPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&ierror];

    [iPlayer play];
}

有谁可以弄清楚这里有什么问题?

2 个答案:

答案 0 :(得分:2)

我认为不应手动轮询加速度计,而应使用内置的方向通知。如果需要FaceUp和FaceDown方向,可以使用下面的内容。或者你可以使用第二种方法简单地描绘风景,肖像。

依赖于设备方向的

第一种方法。如果您需要FaceUp或FaceDown方向,或者如果您没有UIViewController,则很重要。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
   addObserver:self selector:@selector(orientationChanged:)
   name:UIDeviceOrientationDidChangeNotification
   object:[UIDevice currentDevice]];

这是构建方法。

- (void) orientationChanged:(NSNotification *)note
{
   UIDevice * device = note.object;
   switch(device.orientation)
   {
       case UIDeviceOrientationPortrait:
       /* Play a sound */
       break;

       case UIDeviceOrientationPortraitUpsideDown:
       /* Play a sound */
       break;

       // ....

       default:
       break;
   };
}

第二种方法,它依赖于UIViewController的interfaceOrientations。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    switch (toInterfaceOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
            /* Play a Sound */
            break;

        case UIInterfaceOrientationPortrait:
            /* Play a Sound */
            break;

            // .... More Orientations

        default:
            break;
    }
}

答案 1 :(得分:0)

加速度计来自单词加速 - 它不会告诉您设备的方向,它会告诉您它在x,y和z轴上空间移动的速度。 使用UIInterfaceOrientation&& UIDeviceOrientation。