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

В этом уроке я покажу, как с помощью события touchesMoved увеличивать и уменьшать изображение в UIImageView. Пока я еще не подготовил точного кода для этих операций, но есть код, указывающий, когда именно наступает масштабирование. Если кто-то уже знает, как увеличивать и уменьшать изображение, поделитесь этим с нами.
Перед тем, как приступить к внедрению события touchesMoved, задекларируем ряд переменных и методов в файле ImgViewController.h. Вот как после этого будет выглядеть заголовочный файл:

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

@interface ImgViewController : UIViewController {

IBOutlet UIImageView *imgView;
NSTimer *timer;
CGFloat initialDistance;

}

- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint;
- (void) clearTouches;

@end

Несложно догадаться, что посредством disanceBetweenTwoPoints вычисляется расстояние между двумя точками. С помощью initialDistance отслеживается расстояние, на котором срабатывает метод touchesBegan. Для масштабирования сначала рассчитаем расстояние между двумя пальцами и сохраним в переменной initialDistance. Вот как должен выглядеть метод touchesBegan:

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
28
29
30
31
32
33
34
35
36
37
38
39
- (void)touchesBegan:(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: //Одно нажатие.
{
//На 2 сек запускается таймер.
timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self
selector:@selector(showAlertView:) userInfo:nil repeats:NO];

[timer retain];
} break;
case 2: {//Двойное нажатие.

//Вычисление начального расстояния между двумя пальцами.
UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];

initialDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]]
toPoint:[touch2 locationInView:[self view]]];
} break;
}
} break;
case 2: { //Двойное нажатие

} break;
default:
break;
}

}

Получаем первые объекты касания для индекса 0 и 1, потом рассчитываем начальное расстояние между двумя точками. Вот как выглядит метод distanceBetweenTwoPoints:

1
2
3
4
5
6
7
- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint {

float x = toPoint.x - fromPoint.x;
float y = toPoint.y - fromPoint.y;

return sqrt(x * x + y * y);
}

При событии touchesMoved обнаруживаются минимум два касания экрана. Получаем объект касания для индекса 0 and 1, рассчитываем расстояние между finalDistance и initialDistance. Если значение initialDistance больше, чем finalDistance, значит, изображение было уменьшено. Если наоборот — то увеличено. Исходный код выглядит следующим образом:

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
28
29
30
31
32
33
34
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

if([timer isValid])
[timer invalidate];

NSSet *allTouches = [event allTouches];

switch ([allTouches count])
{
case 1: {

} break;
case 2: {
//Изображение увеличено или уменьшено.

UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];

//Расчет расстояния между двумя пальцами.
CGFloat finalDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]]
toPoint:[touch2 locationInView:[self view]]];

//Проверка на увеличение/уменьшение.
if(initialDistance > finalDistance) {
NSLog(@"Zoom Out");
}
else {
NSLog(@"Zoom In");
}

} break;
}

}

NSLog сообщает, верны ли наши действия. Если кто-то знает, как увеличить/уменьшить изображение, дайте знать.

Поскольку мы постоянно отслеживаем значение initialDistance, нужно удалить его при отмене либо прекращении касаний. Сделаем это в методе clearTouches, вызываемом событиями touchesEnded и touchesCanceled. Вот как выглядит данный метод:

1
2
3
4
- (void)clearTouches {

initialDistance = -1;
}

Надеюсь, что и без функций приближения/уменьшения урок был полезен. Жду комментарии. Спасибо за внимание.

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

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

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

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


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