你可以附加一个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; } } }