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