|
Май
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; } |
Надеюсь, что и без функций приближения/уменьшения урок был полезен. Жду комментарии. Спасибо за внимание.

(4 голосов, средний: 4.25 из 5)
Последние комментарии
Подскажите пожалуйста… Вот...
Код не открывает страницы по простой причине -...
можно было бы использовать сглаживание MSAA, графика была бы на...