Чтение онлайн

на главную

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

— (void) motionEnded:(UIEventSubtype)motion

withEvent:(UIEvent *)event{

/* Обрабатываем движение. */

}

Как видите, параметр motion относится к типу UIEventSubtype. Тип UIEventSubtype имеет, в частности, значение UIEventSubtypeMotionShake, которое нас и интересует. Зарегистрировав такое событие, мы можем быть уверены в том, что

пользователь встряхнул устройство.

Далее переходим к реализации контроллера вида и обрабатываем метод motionEnded: withEvent::

— (void) motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{

if (motion == UIEventSubtypeMotionShake){

UIAlertView *alert =

[[UIAlertView alloc] initWithTitle:@"Shake"

message:@"The device is shaken"

delegate: nil

cancelButtonTitle:@"OK" otherButtonTitles: nil];

[alert show];

}

}

Если теперь встряхнуть устройство или имитировать такое движение в эмуляторе iOS (см. введение к этой главе), в окне консоли мы увидим текст Detected a shake (Обнаружено встряхивание).

18.5. Получение данных гироскопа

Постановка задачи

Требуется получать информацию о движении устройства от гироскопа, установленного в устройстве с iOS.

Решение

Выполните следующие шаги.

1. Выясните, имеется ли в данном устройстве гироскоп. О том, как это делается, рассказано в разделе 18.2.

2. Если гироскоп в устройстве есть, проверьте, не посылает ли он уже уведомления. О том, как это делается, рассказано в разделе 18.2.

3. Воспользуйтесь методом экземпляра setGyroUpdateInterval:, относящимся к классу CMMotionManager, чтобы указать, сколько обновлений вы хотите получать в секунду. Например, если вы желаете получать 20 обновлений в секунду, задайте здесь значение 1.0/20.0.

4. Активизируйте метод экземпляра startGyroUpdatesToQueue: withHandler:, относящийся к классу CMMotionManager. Объект очереди может просто представлять собой главную операционную очередь (как мы увидим позже), а блок обработчика должен соответствовать формату CMGyroHandler.

Эти шаги реализуются в следующем коде:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

CMMotionManager *manager = [[CMMotionManager alloc] init];

if ([manager isGyroAvailable]){

if ([manager isGyroActive] == NO){

[manager setGyroUpdateInterval:1.0f / 40.0f];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[manager

startGyroUpdatesToQueue: queue

withHandler: ^(CMGyroData *gyroData, NSError *error) {

NSLog(@"Gyro Rotation x = %.04f", gyroData.rotationRate.x);

NSLog(@"Gyro Rotation y = %.04f", gyroData.rotationRate.y);

NSLog(@"Gyro Rotation z = %.04f", gyroData.rotationRate.z);

}];

} else {

NSLog(@"Gyro is already active.");

}

} else {

NSLog(@"Gyro isn't available.");

}

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Обсуждение

Класс CMMotionManager

позволяет программисту получить от операционной системы iOS обновления данных гироскопа. Сначала нужно убедиться в том, что гироскоп имеется в том устройстве с iOS, где работает ваше приложение (подробнее об этом рассказано в разделе 18.2). Убедившись в этом, можно вызвать метод экземпляра setGyroUpdateInterval:, относящийся к классу CMMotionManager, чтобы задать количество обновлений, которые вы хотите получать от гироскопа в секунду. Например, если вам требуется N обновлений в секунду, задайте здесь значение 1.0/N.

Установив интервал обновлений, можно вызвать метод экземпляра startGyroUpdatesToQueue: withHandler:, относящийся к классу CMMotionManager, — так задается блок для обработки обновлений. О блоках подробнее рассказано в главе 7. Блоковый объект должен относиться к типу CMGyroHandler, принимающему два параметра.

• gyroData — данные, поступающие от гироскопа, заключены в объекте типа CMGyroData. Можно использовать свойство rotationRate класса CMGyroData (это структура) для получения доступа к значениям x, y и z. Эти значения представляют три эйлерова угла, называемых соответственно крен, тангаж и рыскание. Подробнее эти углы рассматриваются в работах по аэродинамике.

• error — ошибка типа NSError, которая может возникнуть, когда гироскоп посылает нам обновления.

Если вы не хотите работать с блоковыми объектами, нужно вызвать метод экземпляра startGyroUpdates, относящийся к классу CMMotionManager, — вместо метода экземпляра startGyroUpdatesToQueue: withHandler: того же класса, — а также создать специальный собственный поток. В этом потоке мы будем считывать обновления, поступающие от гироскопа и передаваемые свойству gyroData экземпляра используемого нами класса CMMotionManager.

Поделиться:
Популярные книги

Перестройка миров. Тетралогия

Греков Сергей
Перестройка миров
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Перестройка миров. Тетралогия

Пятничная я. Умереть, чтобы жить

Это Хорошо
Фантастика:
детективная фантастика
6.25
рейтинг книги
Пятничная я. Умереть, чтобы жить

Внешники

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Внешники

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Релокант 9

Flow Ascold
9. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант 9

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Я тебя не предавал

Бигси Анна
2. Ворон
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не предавал

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Лорд Системы 7

Токсик Саша
7. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 7

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2