我有兴趣在我的项目中开发类似Snapchat的手势,其中触摸事件将调用新的视图控制器,并且仅当用户的手指仍然按下时,视图控制器才可见。
目前,我设法实施了wildcard gesture recognizer
,其中包含touchesBegan
,touchesMoved
和touchesEnded
的回调阻止。
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
。但触摸似乎不会继续我的第二个视图控制器,即使我再次点击我的第二个视图控制器的视图并且手势识别器正确识别触摸。
我还应该在这做什么?
答案 0 :(得分:0)
好吧,你可以采取触摸NSSet
和UIEvent
并通过属性将它们传递给新控制器,但是当用户移动手指然后操作系统时,可能没有必要将发送新的触摸事件。
我相信窗口中的控制器是什么,然后它的视图应该拾取新事件。因此,您可以通过" didPress"将bool值添加到新控制器,然后侦听要在新控制器上调用的touchesEnded
委托。这应该会给你你想要的互动。
请记住这是关闭袖口所以你可能需要稍微玩一下。
答案 1 :(得分:0)
我的解决方案有三个步骤:
从故事板中实例化您的子视图控制器,请注意您将为视图控制器设置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")
}
实现通配符手势识别器,在触摸开始时执行touchesBeganBlock
,将table view cell
或任何其他要将此手势附加到其中的对象添加到父视图控制器中,如下所示:
var touchesBeganCallback : ((NSSet, UIEvent)-> Void)?
func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
if (touchesBeganCallback != nil){
touchesBeganCallback!(touches,event)
}
}
此touchesBeganBlock
将调用实例化视图控制器的函数(步骤1中的代码)
最后,当触摸结束时,执行一个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
}