【问题标题】:Double tap in UIGestureRecognizer在 UIGestureRecognizer 中双击
【发布时间】:2017-01-20 18:41:37
【问题描述】:

我的项目有一个自定义的 uitableviewCell,里面有一个图像滑块。基本上是一个带有图像分页的滚动视图。

我需要点击并双击此 ImageSlider 来执行一些操作。单击可以正常工作,但没有触发双击选择器。

override func awakeFromNib() {
    super.awakeFromNib()

    let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTap(_:)))
    singleTap.numberOfTapsRequired = 1
    singleTap.cancelsTouchesInView = false
    slideShowView.addGestureRecognizer(singleTap)


    //Double tap recognizer
    let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doubleTap(_:)))
    doubleTap.cancelsTouchesInView = false
    doubleTap.numberOfTapsRequired = 2

    slideShowView.addGestureRecognizer(doubleTap)

    singleTap.require(toFail: doubleTap)

    print("slideshow recognizers",slideShowView.gestureRecognizers!) }         


func doubleTap(_ sender : UITapGestureRecognizer) {

     print("doubletap")        
}

 func singleTap(_ sender : UITapGestureRecognizer) {

     print("singleTap")
}

问候

编辑:你可以在这里看到我的日志,我也改变了我原来的帖子

 slideshow recognizers [<UITapGestureRecognizer: 0x17ec1670; state = Possible; view = <ImageSlideshow.ImageSlideshow 0x17ec0e30>; target= <(action=singleTap:, target=<Descubra.FeedDefaultCell 0x183cf800>)>; must-fail = {
    <UITapGestureRecognizer: 0x17e763b0; state = Possible; view = <ImageSlideshow.ImageSlideshow 0x17ec0e30>; target= <(action=doubleTap:, target=<Descubra.FeedDefaultCell 0x183cf800>)>; numberOfTapsRequired = 2>
}>, <UITapGestureRecognizer: 0x17e763b0; state = Possible; view = <ImageSlideshow.ImageSlideshow 0x17ec0e30>; target= <(action=doubleTap:, target=<Descubra.FeedDefaultCell 0x183cf800>)>; numberOfTapsRequired = 2; must-fail-for = {
    <UITapGestureRecognizer: 0x17ec1670; state = Possible; view = <ImageSlideshow.ImageSlideshow 0x17ec0e30>; target= <(action=singleTap:, target=<Descubra.FeedDefaultCell 0x183cf800>)>>
}>]

singleTap

【问题讨论】:

  • requireToFail 如果您在同一视图上使用两个手势,则必须这样做。还要确保您的视图 hase userinteractionenabled = YES 并且您在 tableview DidSelect 中没有阻止双击被触发的方法。
  • @sneak 它的 userInteractionEnabled = true,否则我无法在幻灯片中滑动我的图片,并且单键正在工作,因为我在另一个视图中打开每张图片。
  • 对不起,我错过了你拥有 UIScrollView 的部分。如果你在你的文本中写 UIScrollView 会容易得多,因为将来人们会错过细节。似乎 ScrollView 有自己的双击方法,这就是为什么它会因您的自定义方法而失败。尝试在滚动视图上设置 delaysContentTouches = NO 并让我知道这是否能解决您的问题。否则,既然您知道问题所在,您可以更轻松地在 Google 上找到解决方案。总帐

标签: ios objective-c iphone swift


【解决方案1】:

要使单击手势和双击手势一起工作,系统在看到单个手势时需要知道它是真正的单个手势还是双击手势的前半部分。它必须要么了解未来(这将是一个非常有价值的功能),要么必须等待,看看接下来会发生什么。告诉它等等看……

singleTap.requireGestureRecognizerToFail(doubleTap)

【讨论】:

  • 感谢回复,但正如您在我的代码中看到的那样,我已经尝试过了,它的注释为 //singleTap.require(toFail: doubleTap) (swift 3 版本)。它没有工作
  • @pneves - 抱歉。错过了评论。唔。你能同时去掉 cancelsTouchesInView=false 吗,还是你也试过了?
  • @pneves - 手势代码看起来很合适,所以我想知道它是否更微妙。这是一个表格视图单元子类,对吧?当您在表格视图中注册时,您使用的是 registerClass: 还是 registerNib: ?无论哪种情况,您都应该为此代码使用指定的初始化程序(initWithStyle 用于 registerClass 或 initWithCoder 用于 registerNib)。使用 registerClass 时不会调用 awakeFromNib(我认为)。如果您看到 no 触摸行为,我会对这一切更有信心。
  • 是的,它是一个表格视图单元子类。我在我的委托控制器 self.tableView.register(UINib.init(nibName: "FeedDefaultCell", bundle: nil), forCellReuseIdentifier: kDefaultCellID) 中注册了 nib。正在调用 singleTap 方法,所以我认为它没有任何问题
  • 只是为了放纵我,在posted方法中,添加gr后,NSLog slideShowView.gestureRecognizers。是你所期望的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多