Как я могу обнаружить событие касания UIImageView?

Я разместил изображение (UIImageView) на панели навигации. Теперь я хочу обнаружить событие касания и обработать это событие. Как я могу это сделать?


person ebaccount    schedule 12.05.2009    source источник
comment
В этой ситуации я бы (и думаю, что вам следует) использовать вместо этого настраиваемый UIButton.   -  person titaniumdecoy    schedule 20.10.2012
comment
Отметьте Ответ на версию Swift http://stackoverflow.com/a/41328885/3177007   -  person Mohamed Jaleel Nazir    schedule 26.12.2016


Ответы (10)


С практической точки зрения, не делайте этого.

Вместо этого добавьте кнопку с пользовательским стилем (без графики кнопок, если вы не укажете изображения) поверх UIImageView. Затем прикрепите к нему любые методы, которые вы хотите вызвать.

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

person Kendall Helmstetter Gelner    schedule 13.05.2009
comment
Я добавил кнопку на панель навигации, и я также могу обрабатывать события касания. Однако я хочу добавить круглое изображение на эту кнопку. Не могли бы вы сообщить мне, как это сделать программно? Кроме того, не могли бы вы сообщить мне, как программно настроить свойство кнопки на пользовательское? - person ebaccount; 14.05.2009
comment
Посмотрите документацию для UIButton - вам нужно установить фоновые изображения для состояния управления, вам понадобятся разные изображения для нормального и выбранного / выделенного. Я полагаю, что стиль кнопки - это то, что вы установили для UIButtonStyleCustom - опять же, посмотрите документацию на свойство style в UIButton. - person Kendall Helmstetter Gelner; 14.05.2009
comment
Разве добавление UIButton поверх UIImageView не является чрезмерным? Вы добавляете дополнительный объект, тогда как вы можете просто реализовать методы касаний уже существующего объекта UIImageView. Нет? - person samvermette; 20.05.2010
comment
Если вы посмотрите на размер UIButton в памяти, это практически ничего, и у вас их всего несколько на экран. То, что вы получаете бесплатно, - это вся проводка целевого действия для разных состояний (например, касание внутри), а также приятное поведение, например, не срабатывает, когда вы нажимаете, а двигаете пальцем в сторону. По сути, кнопки являются одними из самых тонко созданных объектов во всей системе, и думать, что вы собираетесь создать собственный сенсорный код, который работает лучше, - безумие. Используйте то, что дешево и хорошо работает, сохраните нестандартную работу для вещей, которые фреймворки еще не обрабатывают за вас. - person Kendall Helmstetter Gelner; 21.05.2010
comment
Вы также можете наложить UIControl, если все, что вам нужно, это события касания (через addTaget: action: forControlEvents :). Это немного дешевле, чем UIButton, у которого есть изображения и несколько состояний. Кроме того, я использую условные выражения препроцессора, чтобы изменить цвет фона наложенного элемента управления на розовый, чтобы я мог точно видеть, где они находятся (и помнить, что они существуют :-). - person Jeff; 20.04.2011

UIImageView происходит от UIView, производного от UIResponder, поэтому он готов обрабатывать события касания. Вы захотите предоставить методы touchesBegan, touchesMoved и touchesEnded, и они будут вызываться, если пользователь коснется изображения. Если все, что вам нужно, это событие касания, проще просто использовать настраиваемую кнопку с изображением, установленным в качестве изображения кнопки. Но если вам нужен более точный контроль над метчиками, перемещениями и т. Д., Это то, что вам нужно.

Вы также захотите взглянуть на еще несколько вещей:

  • Переопределите canBecomeFirstResponder и верните YES, чтобы указать, что представление может стать фокусом событий касания (по умолчанию NO).

  • Установите для свойства userInteractionEnabled значение YES. Значение по умолчанию для UIViews - ДА, но для UIImageViews - НЕТ, поэтому вы должны явно включить его.

  • Если вы хотите реагировать на события мультисенсорного ввода (например, масштабирование, масштабирование и т. Д.), Вам нужно установить multipleTouchEnabled на ДА.

person Ramin    schedule 13.05.2009
comment
Я пробовал это, но тем не менее я не получаю события touchesBegan ... почему это так? - person Markus; 10.11.2010
comment
@Markus: У меня была та же проблема, но я решил ее, установив для userInteractionEnabled значение YES в моем родительском представлении. См. stackoverflow.com/questions/5887305/ - person Saxon Druce; 16.09.2011

Чтобы добавить событие касания в UIImageView, используйте в файле .m следующее:

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // Treat image tap
}
person Yup.    schedule 15.07.2013
comment
userInteractionEnabled = true - это та часть, о которой легко забыть, спасибо. - person Michael Peterson; 13.04.2016

Вы также можете добавить UIGestureRecognizer. Это не требует от вас добавления дополнительного элемента в вашу иерархию представлений, но по-прежнему предоставляет вам весь хорошо написанный код для обработки событий касания с довольно простым интерфейсом:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];
person spolu    schedule 09.08.2011
comment
НЕ забудьте установить UserInteractionEnabled для imgView_ - person Anonymous White; 30.10.2012

Последние несколько часов я был в разных темах, пытаясь найти решение своей проблемы, но безрезультатно. Я вижу, что многие разработчики разделяют эту проблему, и я думаю, что люди здесь об этом знают. У меня есть несколько изображений внутри UIScrollView, я пытаюсь получить на них события касания.

Я не получаю никаких событий от UIImangeView, но я получаю событие от похожего UILable с очень похожими параметрами, которые я для него устанавливаю. Под iOS 5.1.

Я уже сделал следующее:

  1. установите для setUserInteractionEnabled значение YES как для `UIImageView, так и для родительского представления.
  2. установите для setMultipleTouchEnabled значение ДА для UIImageView.
  3. Пробовал создать подкласс UIImageView, не помогло.

Прилагая некоторый код ниже, в этом коде я инициализирую как UIImageView, так и UILabel, метка отлично работает с точки зрения событий запуска. Я пытался убрать ненужный код.

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image = img;
single_view.layer.zPosition = 4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled = YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor = [UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition = 4;

И метод, обрабатывающий событие:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@", [tappedView class]);
}

Как уже говорилось, метка для метки получена.

person ilan    schedule 23.07.2012

Вместо того, чтобы создавать осязаемый UIImageView, а затем размещать его на панели навигации, вы должны просто создать UIBarButtonItem, который вы делаете из UIImageView.

Сначала сделайте просмотр изображения:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

Затем сделайте элемент barbutton из представления изображения:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

Затем добавьте элемент кнопки панели на панель навигации:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Помните, что этот код переходит в контроллер представления, который находится внутри массива контроллера представления контроллера навигации. Таким образом, этот элемент сенсорной кнопки панели, выглядящей как изображение, будет отображаться на панели навигации только тогда, когда этот контроллер представления отображается. Когда вы нажимаете другой контроллер представления, этот элемент кнопки панели навигации исчезает.

person yujean    schedule 23.04.2010

Возможно, вы захотите переопределить метод touchesBegan:withEvent: UIView (или подкласса), который содержит ваше UIImageView подпредставление.

В этом методе проверьте, попадает ли какое-либо из UITouch касаний в границы экземпляра UIImageView (скажем, он называется imageView).

То есть пересекается ли CGPoint элемент [touch locationInView] с CGRect элементом [imageView bounds]? Посмотрите на функцию CGRectContainsPoint, чтобы запустить этот тест.

person Alex Reynolds    schedule 12.05.2009
comment
Спасибо за ответ. Я добавил такое представление: [navBar addSubview: self.pImage]; // добавлен как часть панели навигации. Я переопределил функцию, но функция никогда не вызывается. Я установил для свойства userInteractionEnabled UIImageView значение YES. Я что-нибудь упускаю? - person ebaccount; 13.05.2009
comment
Ознакомьтесь с методом touchesBegan: withEvent:. В поисковых системах есть множество примеров того, как это работает. - person Alex Reynolds; 13.05.2009

Сначала вы должны разместить UIButton, а затем либо добавить фоновое изображение для этой кнопки, либо вам нужно разместить UIImageView поверх кнопки.

Or:

Вы можете добавить жест касания в UIImageView, чтобы получить действие щелчка при нажатии на UIImageView.

person Hilaj    schedule 14.07.2015

Для тех из вас, кто ищет решение Swift 4 для этого ответа, вы можете использовать следующее, чтобы обнаружить событие касания в UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Затем вам нужно будет определить свой селектор следующим образом:

@objc func imageViewTapped() {
    // Image has been tapped
}
person Josh    schedule 24.04.2018

Добавьте жест в это представление. Добавьте изображение в это представление, и тогда он также обнаружит жест на изображении. Вы можете попробовать использовать метод делегата события касания. Тогда в этом случае это также может быть обнаружение.

person user1240409    schedule 25.07.2012