CMMotionManager *motionManager = [[CMMotionManager alloc] init];
if ([motionManager isGyroAvailable]){
NSLog(@"Gryro is available.");
} else {
NSLog(@"Gyro is not available.");
}
if ([motionManager isGyroActive]){
NSLog(@"Gryo is active.");
} else {
NSLog(@"Gryo is not active.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Эмулятор iOS не позволяет имитировать работу гироскопа. Запустив этот код в эмуляторе, вы увидите в окне консоли примерно такой текст:
Gyro is not available. // гироскоп недоступен
Gyro is not active. // гироскоп неактивен
Если запустить этот код на устройстве с iOS, оборудованном гироскопом, например на новом iPhone, то результаты будут иными:
Gyro is available. // гироскоп доступен
Gyro is not active. // гироскоп неактивен
Обсуждение
Если вы планируете выпустить приложение, в котором используется гироскоп, то нужно гарантировать, что ваша программа сможет работать и на других устройствах с iOS, где нет такого оборудования. Например, если вы используете гироскоп как элемент игры, то нужно убедиться в том, что игра будет работать и на других устройствах, хотя гироскопа они и не имеют. Ведь не во всех устройствах с iOS он установлен. Именно наличие гироскопа в устройстве мы и будем проверять в данном разделе.
Чтобы решить эту задачу, потребуется инстанцировать объект типа CMMotionManager. После этого мы должны будем получить доступ к логическому методу isGyroAvailable и посмотреть, доступен ли гироскоп на том устройстве, где выполняется ваш код. Кроме того, можно воспользоваться методом isGyroActive экземпляра CMMotionManager, чтобы узнать, посылает ли гироскоп в настоящее время обновления вашему приложению. Подробнее об этом поговорим в разделе 18.5.
См. также
Раздел 18.5.
18.3. Получение данных акселерометра
Постановка задачи
Требуется указать операционной системе iOS, чтобы она посылала вашей программе данные от акселерометра.
Решение
Пользуйтесь методом экземпляра startAccelerometerUpdatesToQueue: withHandler:, относящимся к классу CMMotionManager. Вот заголовочный файл контроллера вида, в котором класс CMMotionManager применяется для получения обновлений от акселерометра:
#import «ViewController.h»
#import
@interface ViewController ()
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
@implementation ViewController
Мы реализуем контроллер вида и воспользуемся методом startAccelerometerUpdatesToQueue: withHandler: класса CMMotionManager:
— (void)viewDidLoad{
[super viewDidLoad];
self.motionManager = [[CMMotionManager alloc] init];
if ([self.motionManager isAccelerometerAvailable]){
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[self.motionManager
startAccelerometerUpdatesToQueue: queue
withHandler: ^(CMAccelerometerData *accelerometerData, NSError *error) {
NSLog(@"X = %.04f, Y = %.04f, Z = %.04f",
accelerometerData.acceleration.x,
accelerometerData.acceleration.y,
accelerometerData.acceleration.z);
}];
} else {
NSLog(@"Accelerometer is not available.");
}
}
Обсуждение
Акселерометр фиксирует данные по трем измерениям (то есть по осям декартовых координат), которые iOS сообщает вашей программе как значения
typedef struct {
double x;
double y;
double z;
} CMAcceleration;