我如何检测UIImageView的触摸事件


Answers:


137

实际上,不要那样做。

而是在UIImageView上添加具有自定义样式的按钮(除非指定图像,否则没有按钮图形)。然后将要调用的任何方法附加到该方法。

您可以在很多情况下使用该技术,在这些情况下,您确实希望屏幕的某些区域充当按钮而不是弄乱Touch东西。


我在导航栏中添加了一个按钮,我还可以处理触摸事件。但是,我想在此按钮上添加圆形图像。您能否让我知道我该如何编程?另外,您能否让我知道如何以编程方式将button属性设置为“ custom”?
ebaccount

看一下UIButton的文档-您需要为控件状态设置背景图片,您需要正常,选择/突出显示不同的图片。我相信按钮样式是您设置为UIButtonStyleCustom的样式-再次,请看一下UIButton上style属性的文档。
肯德尔·赫尔姆斯特·吉尔纳

1
难道不是在UIImageView的顶部添加一个UIButton吗?您要添加一个额外的对象,而您可以只实现已经存在的UIImageView对象的touches方法。没有?
samvermette,2010年

32
如果您查看内存中UIButton的大小,则实际上没有任何内容,每个屏幕只有几个。您免费获得的是针对不同状态(例如在内部进行触摸)的整个目标动作接线,以及良好的行为,例如在按下时不会触发,而是将手指向侧面滑动。基本上,按钮是整个系统中最精致的对象之一,并且认为您将要做得更好的自定义触摸代码是疯狂的。使用便宜且运行良好的工具,将自定义工作保存在框架尚未为您处理的事情上。
肯德尔·赫尔姆斯特·盖尔纳

6
如果您需要的只是触摸事件,也可以覆盖UIControl(通过addTaget:action:forControlEvents :)。它比具有图像和多个状态的UIButton便宜一些。另外,我使用预处理程序条件将覆盖控件的背景颜色更改为粉红色,以便我可以准确看到它们的位置(并记住它们存在:-)。
杰夫,

115

A UIImageView是从a UIView派生而来的,UIResponder因此它已准备好处理触摸事件。您将要提供的touchesBegantouchesMovedtouchesEnded方法,如果用户点击图片就可以调用。如果您想要的只是一个轻击事件,则只使用将图像设置为按钮图像的自定义按钮会更容易。但是,如果您想对拍子,动作等进行更细粒度的控制,这就是方法。

您还需要查看一些其他信息:

  • 覆盖canBecomeFirstResponder并返回YES,以指示视图可以成为触摸事件的焦点(默认为NO)。

  • userInteractionEnabled属性设置为是。默认UIViews值为YES,但默认UIImageViews值为NO,因此您必须明确将其打开。

  • 如果要响应多点触摸事件(例如,捏,缩放等),则需要设置 multipleTouchEnabled为YES。


我尝试了一下,但更不用说我没有收到touchesBegan事件了……为什么?
Markus

5
@Markus:我遇到了同样的问题,但是通过userInteractionEnabled在父视图上将其设置为YES来解决。见stackoverflow.com/questions/5887305/...
撒克逊德鲁斯

51

要将触摸事件添加到UIImageView中,请在.m中使用以下内容

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


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

希望能有所帮助。


userInteractionEnabled = true是容易忘记的部分,谢谢。
Michael Peterson

23

您还可以添加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];

10
不要忘记为imgView_设置UserInteractionEnabled
匿名白

13

在过去的几个小时里,我一直在尝试不同的解决方案,但都无济于事。我看到许多开发人员都遇到了这个问题,并且我认为这里的人们对此有所了解。我里面有多张图片UIScrollView,试图在它们上获得点击事件。

没有从接收任何事件UIImangeView,但我确实从类似的事件UILable我为其设置了非常相似的参数。在IOS 5.1下。

我已经做了以下工作:

  1. 将UIImageView和父视图的setUserInteractionEnabled设置为YES。
  2. 将setMultipleTouchEnabled设置为YES UIImageView
  3. 尝试子类化UIImageView,没有任何帮助。

在下面附加一些代码,在此代码中,我同时初始化了UIImageViewUILabel,标签在触发事件方面工作良好。我试图排除不相关的代码。谢谢你们,宜兰

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

与其创建一个可触摸的UIImageView而不是将其放置在导航栏上,不如创建一个由UIImageView制成的UIBarButtonItem。

首先制作图像视图:

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

然后将barbutton项目从图像视图中移出:

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

然后将栏按钮项添加到导航栏中:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

请记住,这段代码进入了导航控制器viewcontroller数组内的视图控制器。因此,基本上,此“可触摸的图像显示按钮按钮项”将仅在显示此视图控制器时出现在导航栏中。当您按下另一个视图控制器时,该导航栏按钮项将消失〜


3

您可能想做的是覆盖包含子视图touchesBegan:withEvent:UIView(或子类)方法UIImageView

在此方法中,测试是否有任何UITouch接触落在UIImageView实例的范围内(假设它称为imageView)。

也就是说,它的CGPoint元素[touch locationInView]相交用的CGRect元素[imageView bounds]?查看功能CGRectContainsPoint以运行此测试。


感谢您的回复。我添加了这样的视图:[navBar addSubview:self.pImage]; //添加为导航栏的子视图。我已经重写了该函数,但从未调用过该函数。我已经将UIImageView的属性userInteractionEnabled设置为YES。我有什么想念的吗?
ebaccount

查看touchesBegan:withEvent:方法。搜索引擎上有很多示例说明了其工作原理。
亚历克斯·雷诺兹

1

首先,您应该放置一个UIButton,然后可以为该按钮添加背景图像,或者需要在该按钮上放置一个UIImageView。

要么

您可以将点击手势添加到UIImageView,以便在点击UIImageView时获得点击动作。


0

对于那些正在寻找此答案的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
}

-2

在该视图上添加手势。将图像添加到该视图中,然后它也将在图像上检测手势。您可以尝试使用touch事件的委托方法,在这种情况下也可能正在检测。谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.