我怎样才能检测到UIImageView的触摸事件

eba*_*unt 97 iphone uiimageview uitouch ios

我在导航栏上放置了一个图像(UIImageView).现在我想检测触摸事件并想要处理事件.你能让我知道我该怎么办?

谢谢.

Ken*_*ner 137

实际上,不要这样做.

而是在UIImageView上添加一个带有自定义样式的按钮(除非你指定图像,没有按钮图形).然后附加你想要的任何方法.

你可以在很多情况下使用这种技术,你真的希望屏幕的某些区域充当按钮,而不是搞乱Touch的东西.

  • 如果你看一下内存中UIButton的大小,它实际上什么也没有,你每个屏幕只有几个.你得到的免费是针对不同状态的整个目标动作布线(如内部修饰)以及当你按下但不会将手指滑向侧面时不会触发的良好行为.基本上按钮是整个系统中制作精良的对象之一,并且认为你将要做更好的自定义触摸代码是疯狂.使用廉价且运行良好的,保存框架尚未为您处理的事物的自定义工作. (32认同)
  • 如果你需要的只是触摸事件,你也可以覆盖UIControl(通过addTaget:action:forControlEvents :).它比具有图像和几种状态的UIButton便宜一点.此外,我使用预处理器条件将覆盖控件的背景颜色更改为粉红色,以便我可以确切地看到它们的位置(并记住它们存在:-). (6认同)

Ram*_*min 115

A UIImageView是从UIView派生的派生出来的,UIResponder因此它已准备好处理触摸事件.您将要提供的touchesBegan,touchesMovedtouchesEnded方法,如果用户点击图片就可以调用.如果你想要的只是一个点击事件,那么只需使用自定义按钮并将图像设置为按钮图像就更容易了.但是如果你想要对水龙头,移动等进行更细粒度的控制,那么这就是你要走的路.

你还想看看更多的东西:

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

  • userInteractionEnabled属性设置为YES.默认UIViews值为YES,但是如果UIImageViews为NO,则必须明确打开它.

  • 如果您想要响应多点触控事件(即捏合,缩放等),您需要设置 multipleTouchEnabled为YES.

  • @Markus:我遇到了同样的问题,但通过在父视图上将`userInteractionEnabled`设置为YES来修复它.请参见http://stackoverflow.com/questions/5887305/uiview-user-interaction-enabled-false-on-parent-but-true-on-child (5认同)

Yup*_*up. 51

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

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

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


spo*_*olu 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];
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记为imgView_设置UserInteractionEnabled (10认同)

小智 13

在过去的几个小时里,我一直在寻找解决方案来解决我的问题,但无济于事.我看到很多开发者都有这个问题,我想这里的人都知道这个问题.我在里面有多个图像UIScrollView,试图在它们上面点击事件.

没有得到任何事件UIImangeView,但我确实得到一个类似的事件,UILable我设置的非常相似的参数.根据IOS 5.1.

我已经做了以下事情:

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

附上下面的一些代码,在这段代码中我初始化a 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;
Run Code Online (Sandbox Code Playgroud)

以及处理事件的方法:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}
Run Code Online (Sandbox Code Playgroud)

如上所述,接收标签分接头.


yuj*_*ean 6

而不是制作可触摸的UIImageView然后将其放在导航栏上,您应该创建一个UIBarButtonItem,它是由UIImageView制作的.

首先制作图像视图:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Run Code Online (Sandbox Code Playgroud)

然后从图像视图中删除barbutton项:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Run Code Online (Sandbox Code Playgroud)

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

self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Run Code Online (Sandbox Code Playgroud)

请记住,此代码进入视图控制器,该控制器位于导航控制器视图控制器阵列中.所以基本上,当这个视图控制器显示时,这个"可触摸图像的条形按钮项"只会出现在导航栏中.当您按下另一个视图控制器时,此导航栏按钮项将消失〜


Ale*_*lds 3

您可能想要重写包含子视图touchesBegan:withEvent:的(或子类)的方法。UIViewUIImageView

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

也就是说,该CGPoint元素是否[touch locationInView]与 与CGRect元素相交[imageView bounds]?查看CGRectContainsPoint运行此测试的函数。