Как я могу обнаружить сенсорное событие UIImageView
Я разместил изображение (UIImageView) на панели навигации. Теперь я хочу обнаружить событие касания и хочу обработать событие. Не могли бы вы дать мне знать, как я могу это сделать?
Благодарю.
10 ответов
На практике не делай этого.
Вместо этого добавьте кнопку с пользовательским стилем (без графической кнопки, если вы не укажете изображения) поверх UIImageView. Затем присоедините к этому любые методы, которые вы хотите вызвать.
Вы можете использовать эту технику во многих случаях, когда вы действительно хотите, чтобы какая-то область экрана выполняла функцию кнопки вместо того, чтобы связываться с сенсорным материалом.
UIImageView
происходит от UIView
который получен из UIResponder
так что он готов обрабатывать сенсорные события. Вы хотите предоставить touchesBegan
, touchesMoved
, а также touchesEnded
методы, и они будут вызваны, если пользователь коснется изображения. Если все, что вам нужно, это событие касания, проще использовать пользовательскую кнопку с изображением, установленным в качестве изображения кнопки. Но если вам нужен более точный контроль над кранами, ходами и т. Д., То это путь.
Вы также захотите взглянуть на еще несколько вещей:
Override
canBecomeFirstResponder
и верните YES, чтобы указать, что представление может стать фокусом сенсорных событий (по умолчанию NO).Установить
userInteractionEnabled
собственность на ДА. По умолчанию дляUIViews
это да, но дляUIImageViews
НЕТ, так что вы должны явно включить его.Если вы хотите реагировать на мультисенсорные события (например, пинч, масштабирование и т. Д.), Вы захотите установить
multipleTouchEnabled
ДА.
Чтобы добавить сенсорное событие в 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 в YES для
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"]];
Затем сделайте элемент в виде изображения:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Затем добавьте элемент панели кнопок на панель навигации:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Помните, что этот код входит в контроллер представления, который находится внутри массива viewcontroller контроллера навигации. Таким образом, в основном, этот "сенсорный элемент панели изображения, выглядящий как сенсорное изображение" будет появляться только на панели навигации, когда этот контроллер просмотра отображается. Когда вы нажимаете другой контроллер вида, этот элемент кнопки панели навигации исчезает ~
Что вы можете сделать, это переопределить touchesBegan:withEvent:
метод UIView
(или подкласс), который содержит ваш UIImageView
подтаблицы.
В рамках этого метода проверьте, если какой-либо из UITouch
прикосновения попадают в пределы UIImageView
экземпляр (скажем, это называется imageView
).
То есть CGPoint
элемент [touch locationInView]
пересекаются с CGRect
элемент [imageView bounds]
? Заглянуть в функцию CGRectContainsPoint
запустить этот тест.
Сначала вы должны поместить UIButton, затем либо вы можете добавить фоновое изображение для этой кнопки, либо вам нужно поместить UIImageView поверх кнопки.
или же
Вы можете добавить жест касания к 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
}
Добавьте жест к этому изображению view.add в это представление, тогда он также будет обнаруживать жест на изображении. Не могли бы вы попробовать использовать метод делегата для события касания, тогда в этом случае это также может быть обнаружение. Спасибо