你能将UIGestureRecognizer附加到多个视图吗?

kub*_*ubi 221 objective-c uigesturerecognizer ios

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

在上面的代码中,只view2识别了点击.如果我注释掉第三行,那么点击就会view1被识别出来.如果我是对的,你只能使用一次手势识别器,我不确定这是一个bug还是只需要一些文档.

Tom*_*ift 323

A UIGestureRecognizer将与单个视图一起使用.我同意文件不稳定.这UIGestureRecognizer有一个view属性让它离开:

视图

手势识别器附加到的视图.(只读)

@property(非原子,只读)UIView*视图

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

  • 因为在视图中添加手势识别器会在运行时发生(与编译时相比). (11认同)

小智 48

我使用下面的方法绕过它.

for (UIButton *aButton in myButtons) {

            UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
            longPress.minimumPressDuration=1.0;
            [aButton addGestureRecognizer:longPress];
            [longPress release];

}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这(或与此非常接近的东西)对我不起作用.我在Interface Builder中为点击手势识别器添加了几个视图,并将识别器连接到一个动作.无论何时点击附加视图,都会调用该操作,但gesture.view始终是附加的最后一个视图. (7认同)
  • Aneil,这是因为您没有创建手势识别器的新实例。在此答案的循环中发生的是,创建了手势识别器的新实例,每个实例都仅附加了一个视图。它们都可以指向同一个处理程序,然后您可以在其中查看该视图以查看被触摸了哪个视图。 (2认同)

Geo*_*sda 18

对于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())
Run Code Online (Sandbox Code Playgroud)

  • 这基本上是为两个视图创建多个手势,仍然是相同的规则:每个手势只有一个视图要附加到 (3认同)
  • 不,该函数每次调用时都会创建一个手势 (3认同)
  • 该函数的名称不正确.这里的逻辑函数是一个获取函数.所以它应该命名为:`getGestureRecognize`,因为这就是这个函数的作用 (2认同)

小智 9

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

1)在控制器中创建如下函数(此函数将返回GestureRecognizer)

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

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

[self.view1 addGestureRecognizer:[self setRecognizer]]; 
[self.view2 addGestureRecognizer:[self setRecognizer]];
Run Code Online (Sandbox Code Playgroud)

  • @Mihir Oza,它不能直接用于UILabels。因为标签对用户交互没有意义。如果要为UILabels添加手势,请在Swift中添加以下单行** labelName..isUserInteractionEnabled = true **。然后添加手势。 (2认同)

Jos*_*ord 8

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

Apple文档中有这些明确的信息:

手势识别器附加到视图中

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

适用于iOS的事件处理指南 - 手势识别器 Apple Developer Library

虽然其他人提到他们可能在某些情况下工作,但它显然违反了文档,并且可能会在未来的任何iOS版本中发生变化.

您可以做的是为要监视的视图添加单独的手势识别器,他们可以共享一个共同的操作.