Простое обнаружение движения iPhone - PullRequest
21 голосов
/ 07 марта 2011

Мне нужно определить, когда гироскоп / акселерометр активирован на определенную величину. В основном, чтобы обнаружить, когда есть движение устройства. Я ничего не знаю о Core Motion.

Может быть, кто-то может направить меня в учебник для начинающих или что-то в этом роде.

Заранее спасибо.

Ответы [ 2 ]

35 голосов
/ 07 марта 2011

Я думаю, что вы должны использовать Core Motion.Хорошей новостью является то, что это не так сложно использовать для вашей проблемной области.Начните читать Руководство по обработке событий , особенно раздел Обработка обработанных данных движения устройства.Если вы просто заинтересованы в знании , что было сделано небольшое движение, как вы заявили, вы можете исключить обработку вращения и узкую обработку сигналов в CMDeviceMotion.userAcceleration.Это связано с тем, что каждое вращение приводит также к сигналам акселерометра.

Создайте CMDeviceMotionHandler , как описано в startDeviceMotionUpdatesToQueue: withHandler: Ваш CMDeviceMotionHandler должен делать что-то вроде:

float accelerationThreshold = 0.2; // or whatever is appropriate - play around with different values
CMAcceleration userAcceleration = deviceMotion.userAcceleration;
if (fabs(userAcceleration.x) > accelerationThreshold) 
    || fabs(userAcceleration.y) > accelerationThreshold
    || fabs(userAcceleration.z) > accelerationThreshold) {
    // enter code here
}

По сути, все.Имейте в виду, что каждое ускорение будет иметь аналог.Это означает, что если вы приложите усилие для перемещения (то есть ускорения) устройства вправо, для замедления будет аналог, который остановит движение и позволит устройству остановиться в новом положении.Таким образом, ваше if условие станет истинным дважды для каждого отдельного движения.

2 голосов
/ 07 марта 2011

В viewDidAppear станьте первым респондентом:

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

И убедитесь, что вы можете быть первым респондентом:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

Тогда вы можете реализовать обнаружение движения.

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.subtype == UIEventTypeMotion){
        //there was motion
    }
}
...