Как я могу обнаружить сенсорное событие UIImageView - PullRequest
96 голосов
/ 13 мая 2009

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

Спасибо.

Ответы [ 10 ]

137 голосов
/ 13 мая 2009

На практике не делайте этого.

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

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

115 голосов
/ 13 мая 2009

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

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

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

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

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

49 голосов
/ 16 июля 2013

Чтобы добавить сенсорное событие в UIImageView, используйте в вашем .m

следующее
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

надеюсь, что это поможет.

23 голосов
/ 09 августа 2011

Вы также можете добавить 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];
13 голосов
/ 23 июля 2012

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

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

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

  1. установить для setUserInteractionEnabled значение YES как для UIImageView, так и для parent просмотр.
  2. установите для setMultipleTouchEnabled значение YES для 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]);
}

Как уже было сказано, ярлык получен.

6 голосов
/ 23 апреля 2010

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

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

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

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

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

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

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

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

3 голосов
/ 13 мая 2009

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

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

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

1 голос
/ 14 июля 2015

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

или

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

0 голосов
/ 24 апреля 2018

Для тех из вас, кто ищет решение 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
}
0 голосов
/ 25 июля 2012

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

...