iOS将tapGesture添加到多个视图

我在我的主视图中定义了多个视图。 我想为所有这些视图添加单击手势。 下面是我写的代码,但是这个注册点击手势到我添加的最后一个视图。 所以在下面的代码中,点击仅针对messagesView注册,不针对其他视图。 我有两个问题:

  1. 如何将相同的tapGesture注册到多个视图?

  2. 让我们假设我得到这个工作,现在从这些意见的所有单一水龙头goto相同的function称为oneTap 。 在这个function中,我如何区分轻拍来自哪个视图?

码:

 @synthesize feedsView, peopleView, messagesView, photosView; - (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTap:)]; [singleTap setNumberOfTapsRequired:1]; [singleTap setNumberOfTouchesRequired:1]; [feedsView addGestureRecognizer:singleTap]; [peopleView addGestureRecognizer:singleTap]; [messagesView addGestureRecognizer:singleTap]; //[photosView addGestureRecognizer:singleTap]; [singleTap release]; return; } 

我只有添加到最后一个视图的问题。 可能有更好的解决scheme,但我只是为每个视图创build一个标记手势,并将它们链接到相同的select器方法( oneTap:在你的情况)。 为了区分哪个视图激活了方法,你可以标记你的视图, feedsView.tag = 0; peopleView.tag = 1; feedsView.tag = 0; peopleView.tag = 1; 等等。 然后当这个方法被调用时:

 - (void)oneTap:(UIGestureRecognizer *)gesture { int myViewTag = gesture.view.tag; // now you know which view called // use myViewTag to specify individual actions; } 
  1. 你可以附加一个UIGestureRecognizer到多个视图? 没有。

  2. 两个选项:

    a)给每个UIGestureRecognizer自己的行为。 这种方法的加强:强大的解耦。 缺点:更多的代码重用。 但是,您可以通过为常用function创build方法来缓解代码重用,只需在不同的操作中调用方法即可。

    b)给你添加一个唯一标签的UIGestureRecognizer的每一个视图。 然后,在发件人视图的标签中使用常用操作中的switch语句。 加号:减less代码重用。 缺点:更紧密的耦合。 像这样的东西:

     UIGestureRecognizer *singleTap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)]; [feedsView addGestureRecognizer:singleTap]; feedsView.tag = 33; 

    然后:

     - (void)singleTapAction:(UIGestureRecognizer *)singleTap { UIView *view = singleTap.view; switch (view.tag) { case 33 // view is feedsView break; default: break; } } 

    虽然通常最好采用分离的选项,如果所有的操作都非常相似,这里似乎就是这种情况,而且您确信将来仍然非常相似,那么选项b)与标签可能是更好的select。

PS没有必要明确设置numberOfTapsRequirednumberOfTouchesRequired1因为它们默认设置为1 。 您可以通过按住Command并单击Xco​​de中的numberOfTapsRequired来确认。

1使用hitTest:

 CGPoint location = [singleTap locationInView:self.view]; id testView = [self.view hitTest:location withEvent:nil]; 

2将单一TapGesture添加到多视图,只有最后一个视图有效。