Отслеживание жеста «встряхивание» (Shake, iOS, Xcode 4.2)

Уроки по созданию приложений для iOS (iPhone, iPad, iPod Touch) в Xcode (Objective-C)
Ответить
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Отслеживание жеста «встряхивание» (Shake, iOS, Xcode 4.2)

Сообщение Александр »

Отслеживание жеста «встряхивание» (Shake Gestures, iOS, Xcode 4.2)
Objective-C 2.0, iPhone, iPod, iPad, iOS

Для того чтобы понять что описывается в этой статье, вам нужно иметь представление о том как создаются приложения для iOS. Если вы еще не понимаете основ Objective-C, то сначала посмотрите тему Разработка приложений для iOS. С чего начать (Xcode 4.2).


Теория

Основой в определении событий жестов в Objective-C является класс UIResponder.
Официальную документацию об этом классе можно почитать здесь https://developer.apple.com/library/ios ... rence.html
На этой же странице документации более подробно описано то, что описано в этой статье.

Есть 2 основных вида событий: события прикосновения и события движения.

События прикосновений:
- touchesBegan:withEvent:
- touchesMoved:withEvent:
- touchesEnded:withEvent:
- touchesCancelled:withEvent:

События движений:
- motionBegan:withEvent:
- motionEnded:withEvent:
- motionCancelled:withEvent:


В этой статье я приведу пример работы с событиями движений.

- motionBegan:withEvent:
Сообщает о том, что движение началось.

Код: Выделить всё

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
– motionCancelled:withEvent:
Сообщает о том, что движение отменено.

Код: Выделить всё

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
– motionEnded:withEvent:
Сообщает о том, что движение закончилось.

Код: Выделить всё

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
Всем трем методам доступны следующие переменные:
- motion
событие, указывающее вид движения. Для события встряхивания - это UIEventSubtypeMotionShake.

- event
событие, которое было вызвано движением.



Создаём приложение в Xcode 4.2

1. Создаем новый проект
Называем его, например Shake.


2. Добавляем Label
Называем его label.

Файл ViewController.h

Код: Выделить всё

#import <UIKit/UIKit.h> @interface ViewController : UIViewController {    IBOutlet UILabel *label;} @end
Я делаю это так:
- Выбираю файл ViewController.xib.
- В правой верхней части окна Xcode жму на кнопку Show the Assistant editor и выбираю в этом окне файл ViewController.m
- Кликаю правой кнопкой мыши по label и удерживая кнопку, перетаскиваю линию в код окна с ViewController.m. При этом связь лейбла создается автоматически.


3. Пишем код в ViewController.m
Добавляем

Код: Выделить всё

-(BOOL)canBecomeFirstResponder {    return YES;}
canBecomeFirstResponder - указывает может ли текущее окно первым реагировать на события. По умолчанию NO.

В viewDidAppear добавляем

Код: Выделить всё

[self becomeFirstResponder];
becomeFirstResponder - сообщает о том что текущее окно будет первым реагировать на события.
Сообщаем об этом когда окно появится.

Код: Выделить всё

- (void)viewDidAppear:(BOOL)animated{    [self becomeFirstResponder];    [super viewDidAppear:animated];}

В viewWillDisappear добавляем

Код: Выделить всё

[self resignFirstResponder];
resignFirstResponder - сообщает о том, что текущему окну не надо первым реагировать на события.
Когда окно будет закрыто, сообщим приложению об окончании отлова событий этим окном.

Код: Выделить всё

- (void)viewWillDisappear:(BOOL)animated{    [self resignFirstResponder];    [super viewWillDisappear:animated];}

Чтобы определить что движение началось, будем использовать motionBegan.

Код: Выделить всё

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {    // событие произошло    // проверим что это событие движения встряхивания    if (event.subtype == UIEventSubtypeMotionShake) {        label.text = @"Shaked!";    }}
Мы можем узнать подтип события из самого события, как в коде выше

Код: Выделить всё

if (event.subtype == UIEventSubtypeMotionShake) {
или использовать только motion

Код: Выделить всё

if (motion == UIEventSubtypeMotionShake) {
Почитать про UIEvent и UIEventSubtype можно в документации https://developer.apple.com/library/ios ... rence.html


4. Теперь можно запустить приложение
Если запустить приложение в симуляторе, то можно выбрать в меню Аппаратура - Выполнить жест встряхивания.

Можно загрузить приложение и протестировать на своем устройстве. О том как это сделать без сертификата разработчика описано в статье Запуск приложения на iPhone без сертификата (Xcode 4.2).

При определении движения встряхивания, в лейбле должен появится текст Shaked!
Ответить