Я думаю, что вы должны использовать 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
условие станет истинным дважды для каждого отдельного движения.