UITapGestureRecognizer在iOS9上无法工作

5

我有一个应用程序,使用了UITapGestureRecognizers,但在iOS9 Beta 2中似乎无法正常工作。

它们成功地调用了

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
  NSLog(@"shouldReceiveTouch");
  return YES;
}

但是它没有触发任何其他UITapGesture代理方法。

当我在运行相同的应用程序(来自Xcode 7)在运行iOS 8的设备上时,它按预期工作。

有其他人遇到过这个问题吗?

这是我如何初始化UITapGestureRecognizer。 TapGestureRecognizerSetup

编辑
如果我在代码中创建UITapGestureRecognizer而不是在ViewController xib中创建它,则可以正常工作,因此在iOS9中存在某些xib解析问题或其他问题。

_tapGesture2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMainViewTap:)];
_tapGesture2.numberOfTapsRequired = 1;
_tapGesture2.delegate = self;
[self.view addGestureRecognizer:_tapGesture2];

编辑2
如果我在XIB中删除了GestureRecognizer,并使用XCode 7重新添加它,那么它也可以工作。 当我这样做时,它会在UITapGestureRecognizer下面的xib中添加<pressTypeMask key="allowedPressTypes"/>


你是否将视图的属性“用户交互启用”设置为YES?也许视图无法正确处理触摸。 - Doro
唯一的想法 - 检查TapGestureRecognizer的委托,是否正常? - Doro
奇怪,正在下载 Xcode 7 beta :) - Doro
除了 - (BOOL)gestureRecognizer:(UIGestureRecognizer * nonnull)gestureRecognizer shouldReceiveTouch:(UITouch * nonnull)touch 之外的所有内容 - Liron
1
可以确认这一点。我有一些旧的示例项目,其中包含 IB Gesture Recognizers,但它们无法正常工作,只需在.storyboard文件中添加那个晦涩的 <pressTypeMask key="allowedPressTypes"/> 行即可修复它们的行为。 - yerforkferchips
显示剩余7条评论
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
似乎iOS9在手势识别器和点按识别器的xml中寻找一个``行,没有它,点按识别器将无法正常工作。为了解决这个问题,你可以通过编码构建你的识别器、将该行添加到xml中或者在Xcode7中删除并重新添加手势识别器,这样就可以正确添加`pressTypeMask`到xml中了。 我想知道苹果是否会修复iOS9以使其能够不使用XML中的该行运行,但现在,这是一个简单的解决方法。

2
已向苹果报告了这个漏洞。 - yerforkferchips
你能告诉我更多关于你想在哪里插入<pressTypeMask key="allowedPressTypes"/>吗? - Roman
@Roman,我不知道如何在最新版本的Xcode上重现这个问题。你有遇到这个问题吗? - Liron
@yerforkferchips,是的,我已经将你运行在iOS 8上的项目更新到iOS 9.2 (Swift 2.1)。但是UITapGestureRecognizer无法工作。请帮帮我!如果你从头开始创建一个新项目,一切都能正常工作。 - Roman
尝试移除轻拍手势,然后再添加回去,比较XML的变化。或者你可以通过编程方式创建轻拍手势。 - Liron

1
我也遇到了这个问题,具体是在尝试让我的按钮和带有点击手势的视图在表格单元格中响应点击时,在一个xib中定义布局。在iOS 8和10上运行良好,但在iOS 9上不行。实际问题是我将它们添加到自定义uiview中,并将该视图的类分配给了我的UITableViewCell子类,而不是在IB中使用Table View Cell对象。因此,我没有将我的子视图添加到IB对象提供的contentView中,导致了我的问题。解决方法是重新制作xib以使用Table View Cell作为根,这样我就可以将我的子视图附加到Content View上。

0

实现UIGestureRecognizer的所有可选代理将起作用。


-1

我通过Xcode-7 beta 2进行了检查

我使用gesturerecognizer创建了vc,并为属性和操作创建了outlets。在viewDidload中设置了委托,如下所示: enter image description here

所有在调试期间被调用的方法 - 我已经标记为//called

我收到了下面这些方法的事件:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    print("worked")
    // called
    return true
}

 func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool
 {
    //called
    print("worked")
    return true
}


 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOfGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool
 {
    print("worked")
    //called
    return true
}

尝试按照我提到的重新创建项目,并检查所有的插座和委托。

希望这可以帮助你。


1
我像你一样建立了一个简单的项目,似乎一切都正常运作,但在我的现有应用程序中,除了 shouldReceiveTouch 之外,它从未触发其他委托方法。 - Liron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,