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

时间:2009-05-12 22:02:15

标签: ios iphone uiimageview uitouch

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

感谢。

10 个答案:

答案 0 :(得分:137)

实际上,不要这样做。

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

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

答案 1 :(得分:115)

UIImageView派生自UIViewUIResponder派生自touchesBegan,因此可以处理触摸事件。您需要提供touchesMovedtouchesEndedcanBecomeFirstResponder方法,如果用户点按图片,它们就会被调用。如果你想要的只是一个点击事件,那么只需使用自定义按钮并将图像设置为按钮图像就更容易了。但是如果你想要对水龙头,移动等进行更细粒度的控制,那么这就是你要做的。

您还需要了解更多内容:

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

  • UIViews属性设置为YES。 UIImageViews的默认设置为YES,但multipleTouchEnabled为NO,因此您必须明确启用它。

  • 如果您想要回复多点触控事件(例如捏合,缩放等),您需要将{{1}}设为是。

答案 2 :(得分:49)

要向UIImageView添加触摸事件,请在.m

中使用以下内容
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}
希望有所帮助。

答案 3 :(得分: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];

答案 4 :(得分:13)

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

没有从UIImangeView获取任何事件,但我确实从类似的UILable获得了一个事件,其中我设置的参数非常相似。根据IOS 5.1。

我已经完成了以下工作:

  1. 为`UIImageView和parent设置setUserInteractionEnabled为YES 查看。
  2. UIImageView设置setMultipleTouchEnabled为YES。
  3. 尝试继承UIImageView,但没有任何帮助。
  4. 在下面附加一些代码,在此代码中我初始化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]);
    }
    

    如上所述,收到标签点击。

答案 5 :(得分:6)

您应该创建一个UIBarButtonItem,而不是制作可触摸的UIImageView,然后将其放置在导航栏上。您可以使用UIImageView创建一个UIBarButtonItem。

首先制作图片视图:

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

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

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

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

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

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

答案 6 :(得分:3)

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

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

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

对于那些寻找Swift 4解决方案的人来说这个答案。您可以使用以下内容在UIImageView上检测触摸事件。

git remote add -f somename someremoterepo
git subtree add --prefix ui somename develop --squash

然后,您需要按如下方式定义选择器:

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

答案 9 :(得分:-2)

将该view.add图像上的手势添加到该视图中,然后它也将检测图像上的手势。您是否可以尝试使用触摸事件的委托方法,那么在这种情况下它也可能正在检测。 感谢