Blocked - кубик влево, кубик вправо. Уроки iPhone SDK: (Часть 2) Изучаем Multi Touch - Событие touchesBegan
Май 14

На первом уроке освоим масштабирование изображения с приближением и удалением. Вот как будет выглядеть наше приложение:

app

Для начала выполните перечисленные ниже шаги.

  1. Создайте новый проект, выбрав “Windows-based Application“.
  2. В редакторе IB (Interface Builder) создайте новый элемент UIView, присвоив ему имя ImgView.
  3. В XCode создайте новый файл, выполнив File -> New File -> UIViewController sub class и назовите его “ImgViewController“.
  4. В редакторе IB в окне nib-файла “ImgView” выберите объект “File’s Owner” и откройте для него инспектор свойств командой Tools -> Identity Inspector. В качестве класса в разделе Class Identity укажите “ImgViewContoller“.
  5. Открыв командой Tools -> Connections Inspector окно инспектора связей, установите в IB связь между View Property и представлением View.
  6. Во вновь созданное представление добавьте элемент “UIImageView“.
  7. В папку “Resource” для UIImageView добавьте изображение, с которым будет работать данный элемент.
  8. Выделив изображение, перейдите в окно инспектора атрибутов командой Tools -> Attributes Inspector (в редакторе IB). Найдите нужное изображение в раскрывающемся списке “Image“.
  9. Для параметра “Mode” укажите значение “Center“.
  10. Снимите флажки “User Interaction Enabled” и “Multiple Touch“.
  11. Выделите объект View и в окне “Attributes Inspector” выберите “Multiple Touch“. Обратите внимание, флажок “User Interaction Enabled” уже установлен (если его не трогали).

После двух последних настроек все события–касания будут перенаправляться на контроллер ImgViewController. Для управления изображением нам понадобится переменная типа UIImageView. Вот как будет выглядеть заголовочный файл для “MultiTouchTutorialAppDelegate“.

1
2
3
4
5
6
7
8
9
10
11
12
#import >

@class ImgViewController;

@interface MultiTouchTutorialAppDelegate : NSObject {
UIWindow *window;
ImgViewController *ivController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

В редакторе IB выберите объект “File’s Owner” и откройте для него окно инспектора связей командой Tools -> Connections Inspector. Установите связь между “imgView” и помещенным в представление объектом “UIImageView“. Теперь мы можем управлять объектом через код.

Следующим шагом сделаем представление “ImgView” подпредставлением для метода applicationDidFinishLaunching. Вот как будет выглядеть исходный код:

1
2
3
4
5
6
7
8
9
- (void)applicationDidFinishLaunching:(UIApplication *)application {

ivController = [[ImgViewController alloc] initWithNibName:@"ImgView" bundle:[NSBundle mainBundle]];

[window addSubview:[ivController view]];

// Переписать точку настройки после запуска приложения
[window makeKeyAndVisible];
}

Комбинацией клавиш <Ctrl+return> запустите приложение в симуляторе — должно загрузиться изображение.

Пока приложение не реагирует на события, но это поправимо внедрением нескольких методов. Начнем с метода touchesEnded, вызываемого по окончании события-касания.

1
2
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
}

В этом методе задается реакция на два события — касание и двойное касание. В первом случае происходит увеличение изображения, во втором устанавливается режим центрирования “Center” (как в шаге 9).
Вот как выглядит код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

//Собрать все касания.
NSSet *allTouches = [event allTouches];

//Число касаний на экране
switch ([allTouches count])
{
case 1:
{
//Получить первое касание.
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];

switch([touch tapCount])
{
case 1://Одно нажатие
imgView.contentMode = UIViewContentModeScaleAspectFit;
break;
case 2://Двойное нажатие.
imgView.contentMode = UIViewContentModeCenter;
break;
}
}
break;
}

}

Все касания для конкретного события объединяются в переменную allTouches. Выясняем, сколько пальцев выполняло касания: если речь только об увеличении и уменьшении объекта, логично предположить, что все касания выполняются одним пальцем. Теперь подсчитаем общее количество касаний, вызвав метод подсчета переменной allTouches. Для совершаемых одним пальцем касаний объект Touch принимаем за индекс-нуль и вычисляем количество касаний для данного объекта. Если величина равна единице, изображение уменьшается, если двум — увеличивается. При уменьшении объект contentMode будет соответствовать UIViewContentModeScaleAspectFit, при увеличении — UIViewContentModeCenter.

В этом уроке мы освоили реакцию на событие touchesEnded. В следующих уроках поговорим о событиях, соответствующих началу касания, перемещению и отмене.

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (7 голосов, средний: 4.86 из 5)
Загрузка ... Загрузка ...

One Ping to “Уроки iPhone SDK: (Часть 1) Изучаем Multi Touch - Событие touchesEnded”

  1. Уроки iPhone SDK: (Часть 2) Изучаем Multi Touch - Событие touchesBegan | LookApp.ru - обзоры программ и игр для iPhone Says:

    [...] о работе с событием touchesBegan (обязательно прочтите [первую статью] серии и загрузите исходный [...]


5 Responses to “Уроки iPhone SDK: (Часть 1) Изучаем Multi Touch - Событие touchesEnded”

  1. 1. Leon Says:

    Дремовый урок не понятно не чего, по больше картинок и видео прикрутите!

  2. 2. Artem Says:

    Ну извините…

  3. 3. san Says:

    Leon, дремовый камент. Иди играй в crusis.

  4. 4. ag Says:

    “В редакторе IB выберите объект “File’s Owner” и откройте для него окно инспектора связей командой Tools -> Connections Inspector. Установите связь между “imgView” и помещенным в представление объектом “UIImageView“.”.

    все шаги до этого сделал чётко, как описано. но в Connections Inspector для “File’s Owner” нет “imgView”. в чём может быть проблема?

  5. 5. sah_doum Says:

    действительно ничерта не понятно, застрял на 5 пункте

Оставьте комментарий