из документации Apple: CMMotionManager Class Reference (пардон много читать, я уже выделены жирным шрифтом некоторые предложения для быстрого чрезмерного чтения)
После создания экземпляра CMMotionManager, приложение может использовать его, чтобы получить четыре типа движения: данные о сыром акселерометре, данные сырого гироскопа, данные сырого магнитометра и обработанные данные о движении устройства (включая акселерометр, скорость вращения и измерения ориентации). Обработанные данные о движении устройства, предоставленные алгоритмами слияния датчиков ядра Motion, дают отношение устройства, скорость вращения, калиброванные магнитные поля, направление силы тяжести и ускорение, которое пользователь передает устройству.
Важное замечание Приложение должно создать только один экземпляр класса CMMotionManager. Несколько экземпляров этого класса могут повлиять на скорость получения данных от акселерометра и гироскопа. Приложение может принимать один из двух подходов при получении данных движения, , обрабатывая его с указанными интервалами обновления или периодически сэмплируя данные движения. При обоих этих подходах приложение должно вызывать соответствующий метод остановки (stopAccelerometerUpdates, stopGyroUpdates, stopMagnetometerUpdates и stopDeviceMotionUpdates), когда он закончил обработку акселерометра, скорости вращения, магнитометра или данных движения устройства.
Передав обновления Motion через заданные интервалы Для того, чтобы получить данные о движении через определенные промежутки времени, приложение вызывает метод «старт», который принимает очередь операции (экземпляр NSOperationQueue) и блок-обработчик определенного типа для обработки тех, обновления. Данные движения передаются в обработчик блоков. Частота обновлений определяется значением свойства «интервал».
Акселерометр. Задайте для свойства accelometerUpdateInterval значение интервала обновления. Вызовите startAccelerometerUpdatesToQueue: withHandler: метод, проходящий в блоке типа CMAccelerometerHandler. Данные акселерометра передаются в блок как объекты CMAccelerometerData. Гироскоп. Задайте для свойства gyroUpdateInterval заданный интервал обновления. Вызвать startGyroUpdatesToQueue: withHandler: метод, проходящий в блоке typeCMGyroHandler. Данные скорости вращения передаются в блок как объекты CMGyroData. Магнитометр.Установите для свойства magnetometerUpdateInterval значение интервала обновления. Вызовите startMagnetometerUpdatesToQueue: withHandler: метод, передающий блок типа CMMagnetometerHandler. Данные магнитного поля передаются в блок как объекты CMMagnetometerData. Движение устройства. Задайте для свойства deviceMotionUpdateInterval заданный интервал обновления. Вызов или startDeviceMotionUpdatesUsingReferenceFrame: toQueue: withHandler: или startDeviceMotionUpdatesToQueue: withHandler: метод, передающий в блоке типа CMDeviceMotionHandler. С помощью первого метода (нового в iOS 5.0) вы можете указать опорный кадр, который будет использоваться для оценок отношения. Данные скорости вращения передаются в блок как объекты CMDeviceMotion. Периодическая выборка данных движения Для обработки данных движения с помощью периодической выборки приложение вызывает метод «старт», не принимающий никаких аргументов, и периодически обращается к данным движения, хранящимся в качестве свойства для данных типа движения. Этот подход является рекомендуемым подходом для таких приложений, как игры. Обработка данных акселерометра в блоке приводит к дополнительным накладным расходам, и большинство игровых приложений интересует только последний образец данных движения при рендеринге кадра.
Акселерометр. Call startAccelerometerUpdates для начала обновления и периодического доступа к объектам CMAccelerometerData, читая свойство accelometerData. Гироскоп. Вызовите startGyroUpdates, чтобы начать обновления и периодически получать доступ к объектам CMGyroData, читая свойство gyroData. Магнитометр. Call startMagnetometerUpdates для начала обновления и периодического доступа к объектам CMMagnetometerData, считывая свойство magnetometerData. Движение устройства. Вызовите метод startDeviceMotionUpdatesUsingReferenceFrame: или startDeviceMotionUpdates, чтобы начать обновления и периодически получать доступ к объектам CMDeviceMotion, читая свойство deviceMotion. Метод startDeviceMotionUpdatesUsingReferenceFrame: (новый в iOS 5.0) позволяет указать опорный кадр, который будет использоваться для оценок отношения.
Обсуждение Если данные гироскоп не доступен, то значение этого свойства равно нулю. Приложение, получающее данные гироскопа после вызова startGyroUpdates, периодически проверяет значение этого свойства и обрабатывает данные гироскопа.
, сохраняя их и сравнивая их периодически вы должны быть в состоянии увидеть, если устройство перевернуть вокруг оси и т.д.
Точно, какую ротацию вы ищете? Например, самая легкая ситуация заключается в том, что телефон кладет экран вверх на стол, а когда вы кладете его с экрана вниз, он поворачивается на 180 градусов (вокруг любой оси). Но что представляет собой поворот на 90 градусов? Это на его стороне? Стоит ли стоять прямо? Или вы ищете решение, в котором вы держите свое устройство в случайной ориентации, и вы хотите знать, когда он поворачивается на 180 градусов в любом направлении внутри, скажем, за 2 секунды? То есть очень общее решение, но очень интересно :) – Desmond
Отнюдь не было, я пытаюсь поднять вашу идею от вас. :) Я сожалею о том, что. Но теперь я понимаю вашу проблему. Это можно сделать, но это сложно сделать, и вряд ли будет «простой» ответ на stackoverflow.com. Вы заинтриговали меня, хотя, кажется, очень весело строить! – Desmond
попытаемся преобразовать эти числа в градусы и посмотреть, помогает ли это: http://stackoverflow.com/questions/4576493/how-can-i-use-sensormanager-getorientation-for-tilt-controls-like-my- paper-plan –