Я разместил изображение (UIImageView) на панели навигации. Теперь я хочу обнаружить событие касания и обработать это событие. Как я могу это сделать?
Как я могу обнаружить событие касания UIImageView?
Ответы (10)
С практической точки зрения, не делайте этого.
Вместо этого добавьте кнопку с пользовательским стилем (без графики кнопок, если вы не укажете изображения) поверх UIImageView. Затем прикрепите к нему любые методы, которые вы хотите вызвать.
Вы можете использовать эту технику во многих случаях, когда вы действительно хотите, чтобы какая-то область экрана действовала как кнопка, а не возилась с Touch.
UIImageView
происходит от UIView
, производного от UIResponder
, поэтому он готов обрабатывать события касания. Вы захотите предоставить методы touchesBegan
, touchesMoved
и touchesEnded
, и они будут вызываться, если пользователь коснется изображения. Если все, что вам нужно, это событие касания, проще просто использовать настраиваемую кнопку с изображением, установленным в качестве изображения кнопки. Но если вам нужен более точный контроль над метчиками, перемещениями и т. Д., Это то, что вам нужно.
Вы также захотите взглянуть на еще несколько вещей:
Переопределите
canBecomeFirstResponder
и верните YES, чтобы указать, что представление может стать фокусом событий касания (по умолчанию NO).Установите для свойства
userInteractionEnabled
значение YES. Значение по умолчанию дляUIViews
- ДА, но дляUIImageViews
- НЕТ, поэтому вы должны явно включить его.Если вы хотите реагировать на события мультисенсорного ввода (например, масштабирование, масштабирование и т. Д.), Вам нужно установить
multipleTouchEnabled
на ДА.
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
}
Вы также можете добавить 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];
Последние несколько часов я был в разных темах, пытаясь найти решение своей проблемы, но безрезультатно. Я вижу, что многие разработчики разделяют эту проблему, и я думаю, что люди здесь об этом знают. У меня есть несколько изображений внутри UIScrollView
, я пытаюсь получить на них события касания.
Я не получаю никаких событий от UIImangeView
, но я получаю событие от похожего UILable
с очень похожими параметрами, которые я для него устанавливаю. Под iOS 5.1.
Я уже сделал следующее:
- установите для setUserInteractionEnabled значение YES как для `UIImageView, так и для родительского представления.
- установите для setMultipleTouchEnabled значение ДА для
UIImageView
. - Пробовал создать подкласс
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]);
}
Как уже говорилось, метка для метки получена.
Вместо того, чтобы создавать осязаемый UIImageView, а затем размещать его на панели навигации, вы должны просто создать UIBarButtonItem, который вы делаете из UIImageView.
Сначала сделайте просмотр изображения:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Затем сделайте элемент barbutton из представления изображения:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Затем добавьте элемент кнопки панели на панель навигации:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Помните, что этот код переходит в контроллер представления, который находится внутри массива контроллера представления контроллера навигации. Таким образом, этот элемент сенсорной кнопки панели, выглядящей как изображение, будет отображаться на панели навигации только тогда, когда этот контроллер представления отображается. Когда вы нажимаете другой контроллер представления, этот элемент кнопки панели навигации исчезает.
Возможно, вы захотите переопределить метод touchesBegan:withEvent:
UIView
(или подкласса), который содержит ваше UIImageView
подпредставление.
В этом методе проверьте, попадает ли какое-либо из UITouch
касаний в границы экземпляра UIImageView
(скажем, он называется imageView
).
То есть пересекается ли CGPoint
элемент [touch locationInView]
с CGRect
элементом [imageView bounds]
? Посмотрите на функцию CGRectContainsPoint
, чтобы запустить этот тест.
Сначала вы должны разместить UIButton, а затем либо добавить фоновое изображение для этой кнопки, либо вам нужно разместить UIImageView поверх кнопки.
Or:
Вы можете добавить жест касания в UIImageView, чтобы получить действие щелчка при нажатии на UIImageView.
Для тех из вас, кто ищет решение 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
}
Добавьте жест в это представление. Добавьте изображение в это представление, и тогда он также обнаружит жест на изображении. Вы можете попробовать использовать метод делегата события касания. Тогда в этом случае это также может быть обнаружение.