你可以附加一个UIGestureRecognizer到多个视图?

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]; [self.view1 addGestureRecognizer:tapGesture]; [self.view2 addGestureRecognizer:tapGesture]; [tapGesture release]; 

在上面的代码中,只有view2上的点击才被识别。 如果我注释掉第三行,那么view1上的轻敲就会被识别出来。 如果我是对的,你只能使用手势识别器一次,我不知道这是一个错误,或者只是需要更多的文档。

UIGestureRecognizer将用于单个视图。 我同意这些文件是参差不齐的。 该UIGestureRecognizer有一个单一的view属性给它:

视图

手势识别器所附的视图。 (只读)

@属性(非primefaces,只读)UIView *视图

讨论使用addGestureRecognizer:方法将手势识别器附加(或添加)到UIView对象。

我通过使用下面来解决它。

 for (UIButton *aButton in myButtons) { UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; longPress.minimumPressDuration=1.0; [aButton addGestureRecognizer:longPress]; [longPress release]; } 

然后在我的handleLongPress方法中,我只是设置一个UIButton等于手势识别器的视图,并根据该button来分支我所做的

 - (void)handleLongPress:(UILongPressGestureRecognizer*)gesture { if ( gesture.state == UIGestureRecognizerStateEnded ) { UIButton *whichButton=(UIButton *)[gesture view]; selectedButton=(UIButton *)[gesture view]; .... } 

对于Swift 3来说,如果有人需要这样的话:基于Bhavik Rathod上面的答案。

  func setGestureRecognizer() -> UIPanGestureRecognizer { var panRecognizer = UIPanGestureRecognizer() panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:))) panRecognizer.minimumNumberOfTouches = 1 panRecognizer.maximumNumberOfTouches = 1 return panRecognizer } ///set the recognize in multiple views view1.addGestureRecognizer(setGestureRecognizer()) view2.addGestureRecognizer(setGestureRecognizer()) 

我们可以做这样的事情,这很简单

1)在你的控制器中创build如下的函数(这个函数将返回GestureRecognizer)

 -(UITapGestureRecognizer*)setRecognizer{ UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)]; [gestureRecognizer setNumberOfTapsRequired:1]; return gestureRecognizer; } 

2)现在在多个视图中设置此识别器

 [self.view1 addGestureRecognizer:[self setRecognizer]]; [self.view2 addGestureRecognizer:[self setRecognizer]]; 

不,您不应该将手势识别器附加到多个视图。

苹果文档中有这个明确的信息:

手势识别器连接到视图

每个手势识别器都与一个视图相关联。 相比之下,一个视图可以有多个手势识别器,因为单个视图可能会响应许多不同的手势。 对于手势识别器来识别在特定视图中发生的触摸,您必须将手势识别器附加到该视图。

iOS事件处理指南 – 手势识别器 Apple开发者库

虽然其他人提到他们可能在某些情况下工作,但显然是违反文档,并可能在任何未来的iOS版本中改变。

你可以做的是添加单独的手势识别器到你想要监视的视图,他们可以共享一个共同的行动。

那么如果有人不想为多个button添加手势视图,如kwalker已经回答了上面的问题,并且希望通过Interface Builder来实现,那么这可能对您有所帮助。

1)你可以添加像对象库一样的长按手势识别器,像添加其他对象,如UIButtons和UILabels。

在这里输入图像描述 最初我最终使用的是我只有一个

2)将引用出口设置为UIButton并向文件所有者发送操作。

在这里输入图像描述

注意:如果你有多个UIButton或其他对象,你将需要单独的手势识别器。 有关更多详细信息,请参阅我的这个问题。 在长按手势识别器上获取错误的UIButton标签

用' <UIScrollViewDelegate> '覆盖类

在.m类中使用这个方法:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; } 

此方法将帮助您在单个视图中启用多次刷卡

每次添加指向同一个函数的手势识别器时,重新编写(重新创build)手势识别,又该如何呢? 在以下情况下,它的作品。 我正在使用IBOutletCollection

Swift 2:

 @IBOutlet var topicView: [UIView]! override func viewDidLoad() { for view in self.topicView as [UIView] { view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:")) } } func viewClicked(recognizer: UITapGestureRecognizer) { print("tap") } 

如果你有固定观点,我build议你做这样的事情

 [self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]]; [self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]]; 

这样会减less多个不同的无用variables

你可以使用这个代码来做到这一点我的意见,这是在xib图像。

 - (void)viewDidLoad { firstIV.tag = 501; secondIV.tag = 502; thirdIV.tag = 503; forthIV.tag = 504; [self addTapGesturetoImageView: firstIV]; [self addTapGesturetoImageView: secondIV]; [self addTapGesturetoImageView: thirdIV]; [self addTapGesturetoImageView: forthIV]; } -(void)addTapGesturetoImageView:(UIImageView*)iv { iv.userInteractionEnabled = YES; UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)]; textfielBGIVTapGasture.numberOfTapsRequired = 1; [iv addGestureRecognizer:textfielBGIVTapGasture]; } - (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer { int tag = recognizer.view.tag-500; switch (tag) { case 1: { //firstIV tapped; break; } case 2: { //secondIV tapped; break; } case 3: { //thirdIV tapped; break; } case 4: { //forthIV tapped; break; } default: { break; } } }