Читаем iOS. Приемы программирования полностью

Раздел 18.1.

<p>18.4. Обнаружение встряхивания устройства с iOS</p><p>Постановка задачи</p>

Необходимо узнавать, когда пользователь встряхивает устройство с iOS.

<p>Решение</p>

Пользуйтесь методом motionEnded: withEvent:. Он может относиться к любому объекту вашего приложения, если этот объект принадлежит к типу UIResponder. Так, это могут быть контроллеры видов и даже объект основного окна.

<p>Обсуждение</p>

Метод motionEnded: withEvent: окна вашего приложения вызывается всякий раз, когда операционная система 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 (Обнаружено встряхивание).

<p>18.5. Получение данных гироскопа</p><p>Постановка задачи</p>

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

<p>Решение</p>

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

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;

}

<p>Обсуждение</p>
Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже