如何继续触摸/手势到下一个视图控制器

时间:2015-01-23 16:44:11

标签: ios swift

我有兴趣在我的项目中开发类似Snapchat的手势,其中触摸事件将调用新的视图控制器,并且仅当用户的手指仍然按下时,视图控制器才可见。

目前,我设法实施了wildcard gesture recognizer,其中包含touchesBegantouchesMovedtouchesEnded的回调阻止。

var touchesBeganCallback : ((NSSet, UIEvent)-> Void)?
var touchesMovedCallback : ((NSSet, UIEvent)-> Void)?
var touchesEndedCallback : ((NSSet, UIEvent)-> Void)?

我在通过segue显示之前向第二个视图控制器添加了wildcard gesture recognizer

destVC.view.addGestureRecognizer(drawWildGestureRecognizer({ (touches:NSSet, event:UIEvent) -> Void in
    println("LDetailViewController: touches began")
    }, touchesEndedCallback: { (touches:NSSet, event:UIEvent) -> Void in
       println("LDetailViewController: touches ended")
    }))

当然,我的第一个视图控制器已添加wildcard gesture recognizer。但触摸似乎不会继续我的第二个视图控制器,即使我再次点击我的第二​​个视图控制器的视图并且手势识别器正确识别触摸。

我还应该在这做什么?

2 个答案:

答案 0 :(得分:0)

好吧,你可以采取触摸NSSetUIEvent并通过属性将它们传递给新控制器,但是当用户移动手指然后操作系统时,可能没有必要将发送新的触摸事件。

我相信窗口中的控制器是什么,然后它的视图应该拾取新事件。因此,您可以通过" didPress"将bool值添加到新控制器,然后侦听要在新控制器上调用的touchesEnded委托。这应该会给你你想要的互动。

请记住这是关闭袖口所以你可能需要稍微玩一下。

答案 1 :(得分:0)

我的解决方案有三个步骤:

  1. 从故事板中实例化您的子视图控制器,请注意您将为视图控制器设置storyboardID以进行实例化。

    postDetailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("showPost") as? LDetailViewController
    if postDetailViewController != nil {
      //add child view
      let postDetailView = postDetailViewController!.view
      self.view.addSubview(postDetailView)
    
      //add child view controller
      self.addChildViewController(postDetailViewController!)
      postDetailViewController!.didMoveToParentViewController(self)
    } else {
      fatalError("postDetailViewController fails to be created")
    }
    
  2. 实现通配符手势识别器,在触摸开始时执行touchesBeganBlock,将table view cell或任何其他要将此手势附加到其中的对象添加到父视图控制器中,如下所示:

    var touchesBeganCallback : ((NSSet, UIEvent)-> Void)?
    func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
      if (touchesBeganCallback != nil){
        touchesBeganCallback!(touches,event)
      }
    }
    

    touchesBeganBlock将调用实例化视图控制器的函数(步骤1中的代码)

  3. 最后,当触摸结束时,执行一个touchesEndBlock,它只是调用一个函数来丢弃你的子视图控制器:

    var touchesEndedCallback : ((NSSet, UIEvent)-> Void)?
    func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
      if (touchesEndedCallback != nil){
        touchesEndedCallback!(touches,event)
      }
    }
    
    在我的

    上,该块执行以下代码:

    if (postDetailViewController != nil){
      postDetailViewController?.view.removeFromSuperview()
      postDetailViewController?.removeFromParentViewController()
      postDetailViewController = nil
    }