Я разместил изображение (UIImageView) на панели навигации. Теперь я хочу обнаружить событие касания и обработать это событие. Как я могу это сделать?
Я разместил изображение (UIImageView) на панели навигации. Теперь я хочу обнаружить событие касания и обработать это событие. Как я могу это сделать?
Ответы:
С практической точки зрения, не делайте этого.
Вместо этого добавьте кнопку с пользовательским стилем (без графики кнопок, если вы не укажете изображения) поверх UIImageView. Затем прикрепите к нему любые методы, которые вы хотите вызвать.
Вы можете использовать эту технику во многих случаях, когда вы действительно хотите, чтобы какая-то область экрана действовала как кнопка, а не возилась с Touch.
A UIImageView
является производным от, UIView
который является производным от, UIResponder
поэтому он готов обрабатывать события касания. Вы хотите , чтобы обеспечить touchesBegan
, touchesMoved
и touchesEnded
методы , и они будут вызываться , если пользователь вводит изображение. Если все, что вам нужно, это событие касания, проще просто использовать настраиваемую кнопку с изображением, установленным в качестве изображения кнопки. Но если вам нужен более точный контроль над метчиками, перемещениями и т. Д., Это то, что вам нужно.
Вы также захотите взглянуть на еще несколько вещей:
Переопределите canBecomeFirstResponder
и верните YES, чтобы указать, что представление может стать фокусом событий касания (по умолчанию NO).
Установите userInteractionEnabled
свойство в YES. По умолчанию для UIViews
YES, но для UIImageViews
NO, поэтому вам нужно явно включить его.
Если вы хотите реагировать на события мультисенсорного ввода (например, масштабирование, масштабирование и т. Д.), Вы должны установить multipleTouchEnabled
ДА.
userInteractionEnabled
ДА в моем родительском представлении. См. Stackoverflow.com/questions/5887305/…
Чтобы добавить событие касания в 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.
Я уже сделал следующее:
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
чтобы запустить этот тест.
Для тех из вас, кто ищет решение 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
}
Добавьте жест в это представление. Добавьте изображение в это представление, и тогда он также обнаружит жест на изображении. Вы можете попробовать использовать метод делегата сенсорного события. Тогда в этом случае это тоже может быть обнаружение.