我已经将一个图片(UIImageView)放在了导航栏上。现在我想检测触摸事件并处理该事件。我该如何做?
我已经将一个图片(UIImageView)放在了导航栏上。现在我想检测触摸事件并处理该事件。我该如何做?
实际上,不要那样做。
相反,添加一个自定义样式的按钮(除非您指定图像,否则不要使用按钮图形),覆盖在UIImageView上。然后将您想要调用的任何方法附加到该按钮上。
您可以使用该技术处理许多情况,您真正想要屏幕上的某个区域充当按钮而不是与Touch相关的操作。
UIImageView
是从UIView
继承而来的,后者又是从UIResponder
继承而来的,因此它已经准备好处理触摸事件了。您需要提供touchesBegan
、touchesMoved
和touchesEnded
方法,如果用户点击图像,则这些方法将被调用。如果您只想要一个轻敲事件,那么使用带有图像设置为按钮图像的自定义按钮会更容易。但是,如果您想对轻击、移动等进行更精细的控制,那么这是正确的方法。canBecomeFirstResponder
并返回YES以指示该视图可以成为触摸事件的焦点(默认值为NO)。
- 将userInteractionEnabled
属性设置为YES。对于UIViews
,默认值为YES,但对于UIImageViews
,默认值为NO,因此必须明确打开它。
- 如果您想响应多点触摸事件(即捏合、缩放等),则需要将multipleTouchEnabled
设置为YES。userInteractionEnabled
属性设置为YES来解决了它。请参考https://dev59.com/zW025IYBdhLWcg3wpHl_ - Saxon Druce要为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
和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;
你可能需要覆盖包含UIImageView
子视图的UIView
(或其子类)的touchesBegan:withEvent:
方法。
在此方法中,测试任何UITouch
触摸是否落在UIImageView
实例(假设它被称为imageView
)的边界内。
也就是说,[touch locationInView]
元素的CGPoint
元素是否与[imageView bounds]
元素的CGRect
元素相交?请查看函数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
}