акселерометр iPhone изменяет чувствительность - Cocoa Touch - PullRequest
2 голосов
/ 20 апреля 2011

Здравствуйте. Я хочу изменить чувствительность, когда пользователь перемещает устройство.На данный момент его не очень чувствительный, я считаю, что по умолчанию.Я хочу, чтобы он был более чувствительным, поэтому, когда пользователь немного встряхивает телефон, звучит звук.

Вот код

Спасибо

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self becomeFirstResponder];
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"whip" ofType:@"wav"];
        if (theAudio) [theAudio release];
        NSError *error = nil;
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
        if (error)
            NSLog(@"%@",[error localizedDescription]);
        theAudio.delegate = self;
        [theAudio play];    
    }
}

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Во-первых, убедитесь, что ваш интерфейс использует протокол UIAccelerobeterDelegate.

@interface MainViewController : UIViewController <UIAccelerometerDelegate>

Теперь в вашей реализации:

//get the accelerometer
self.accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer.updateInterval = .1;
self.accelerometer.delegate = self;

Реализация метода делегата:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
  float x = acceleration.x;
  float y = acceleration.y;
  float b = acceleration.z;

  // here you can write simple change threshold logic
  // so you can call trigger your method if you detect the movement you're after
}

Значения, которые акселерометр возвращает для x, y и z, всегда будут с плавающей точкой от -1,0 до 1,0. Вы должны вызвать NSLog и вывести на консоль значения x, y и z, чтобы вы могли понять, что они значат. Тогда вы можете разработать простой способ обнаружения движения.

0 голосов
/ 20 апреля 2011

Если вы пытаетесь воссоздать жест встряхивания, вот несколько вещей, о которых следует помнить:

Встряхивание - это движение в направлении, за которым следует движение в общем противоположном направлении. Это означает, что вам придется отслеживать ваши предыдущие векторы ускорения, чтобы вы знали, когда они меняются. Чтобы вы не пропустили его, вам придется довольно часто пробовать акселерометр.

CGFloat samplesPerSecond = 30;
[[UIAccelerometer sharedAccelerometer] setDelegate: self];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval: 1.0 / samplesPerSecond]; 

Тогда в вашем обратном вызове делегата:

- (void) accelerometer: (UIAccelerometer *) accelerometer didAccelerate: (UIAcceleration *) acceleration {
  // TODO add this acceleration to a list of accelerations and keep the most recent (perhaps 30)
  // TODO analyze accelerations and determine if a direction change occurred
  // TODO if it did, then a shake occurred!  Clear the list of accelerations and perform your action
}
0 голосов
/ 20 апреля 2011

Вы не можете изменить работу событий встряхивания. Если вам нужно что-то другое, вам придется написать свой собственный код обнаружения дрожания, основанный на силах x / y / z, данных вам [UIAccelerometer sharedAccelerometer]; Если вы установите делегата sharedAccelerometer для вашего класса, вы можете получить акселерометр акселерометра: didAccelerate: делегат обратного вызова.

...