98

我在导航栏上放置了一个图像(UIImageView)。现在我想检测触摸事件并处理该事件。我怎样才能做到这一点?

4

10 回答 10

138

实际上,不要那样做。

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

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

于 2009-05-13T06:44:53.543 回答
115

AUIImageView派生自 aUIView派生自,UIResponder因此它已准备好处理触摸事件。您需要提供touchesBegantouchesMovedtouchesEnded方法,如果用户点击图像,它们将被调用。如果您想要的只是一个点击事件,那么使用自定义按钮并将图像设置为按钮图像会更容易。但是,如果您想对点击、移动等进行更细粒度的控制,这就是您要走的路。

您还需要查看更多内容:

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

  • userInteractionEnabled属性设置为 YES。默认为UIViewsYES,但 forUIImageViews为 NO,因此您必须明确打开它。

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

于 2009-05-13T01:32:03.203 回答
51

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

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

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // Treat image tap
}
于 2013-07-15T20:33:06.173 回答
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];
于 2011-08-09T14:00:11.140 回答
13

在过去的几个小时里,我一直在不同的线程上试图为我的问题找到解决方案,但无济于事。我看到很多开发者都有这个问题,我想这里的人都知道这一点。我在 a 中有多个图像UIScrollView,试图在它们上获取点击事件。

我没有从 . 中获得任何事件UIImangeView,但我确实从UILable具有非常相似参数的类似事件中获得了一个事件,我正在为其设置非常相似的参数。在 iOS 5.1 下。

我已经做了以下事情:

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

在下面附加一些代码,在此代码中,我初始化 aUIImageViewUILabel,标签在触发事件方面工作正常。我尝试保留不相关的代码。

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]);
}

如前所述,标签抽头被接收。

于 2012-07-23T10:15:08.367 回答
6

与其制作一个可触摸的 UIImageView 然后将其放在导航栏上,不如只创建一个 UIBarButtonItem,它是由 UIImageView 制作的。

首先制作图像视图:

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

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

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

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

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

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

于 2010-04-23T05:31:34.550 回答
3

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

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

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

于 2009-05-12T23:32:27.773 回答
1

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

或者:

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

于 2015-07-14T05:16:10.097 回答
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
}
于 2018-04-24T10:07:06.593 回答
-2

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

于 2012-07-25T09:24:48.993 回答