iOS将tapGesture添加到多个视图
我在我的主视图中定义了多个视图。 我想为所有这些视图添加单击手势。 下面是我写的代码,但是这个注册点击手势到我添加的最后一个视图。 所以在下面的代码中,点击仅针对messagesView
注册,不针对其他视图。 我有两个问题:
-
如何将相同的tapGesture注册到多个视图?
-
让我们假设我得到这个工作,现在从这些意见的所有单一水龙头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; }
-
你可以附加一个UIGestureRecognizer到多个视图? 没有。
-
两个选项:
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没有必要明确设置numberOfTapsRequired
& numberOfTouchesRequired
为1
因为它们默认设置为1
。 您可以通过按住Command并单击Xcode中的numberOfTapsRequired
来确认。
1使用hitTest:
CGPoint location = [singleTap locationInView:self.view]; id testView = [self.view hitTest:location withEvent:nil];
2将单一TapGesture添加到多视图,只有最后一个视图有效。