0

我正在构建一些类似于SnapChat的功能。按住一个视图,它会调出一个电影,然后在电影完成时(当前正在工作),或者当用户拿起他们的手指(不工作,这就是这个问题的意思)返回到主视图控制器, 。斯威夫特:长按取消电影播放。我如何坚持长按?

我的问题在于IBAction,当视频出现时,UIGestureRecognizerStateBegan变为Cancelled

我想为国家不改变,直到用户提起他们的手指,这应该注册UIGestureRecognizerStateEnded

如何做到这将是真棒任何提示。谢谢!

class ViewController: UIViewController { 
    var moviePlayer: MPMoviePlayerViewController! 

    @IBAction func handleLongPress(recognizer: UILongPressGestureRecognizer) { 
     println("\(recognizer)") 

     if recognizer.state == UIGestureRecognizerState.Began { 
      playVideo() 
     } 

     if recognizer.state == UIGestureRecognizerState.Ended { 
      self.moviePlayer.moviePlayer.stop() 
     } 
    } 

    func videoHasFinishedPlaying(notification: NSNotification){ 
     println("Video finished playing") 
    } 

    func playVideo() { 
     // get path and url of movie 
     let path = NSBundle.mainBundle().pathForResource("IMG_8602", ofType:"MOV") 
     let url = NSURL.fileURLWithPath(path!) 
     moviePlayer = MPMoviePlayerViewController(contentURL: url) 
     presentMoviePlayerViewControllerAnimated(moviePlayer) 

     // construct the views 
     moviePlayer.view.frame = self.view.bounds 
     self.view.addSubview(moviePlayer.view) 

     // remove controls at top and bottom of video 
     moviePlayer.moviePlayer.controlStyle = MPMovieControlStyle.None 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoHasFinishedPlaying:", 
      name: MPMoviePlayerPlaybackDidFinishNotification, object: nil) 

    } 
} 

编辑:一个可能的解决方案

因此,这是一个总的侥幸,但我想通了如何在这种情况下做到这一点。

我只是从我的playVideo函数中删除了行presentMoviePlayerViewControllerAnimated(moviePlayer)

不完全确定这是为什么工作,但它适用于我的上下文。

+0

我有一个'类似'的问题。不一样的事情,但它涉及从长手势到拖动手势http://stackoverflow.com/questions/27790899/begin-uipangesture-event-from-a-pressed-state-at-time-of-instantiation/ 27791190#27791190 – Aggressor 2015-01-20 23:22:17

+0

它不会回答你的问题,但我会说我找不到方法来通过这个手势。我认为你最好的选择是用手势监听器添加超级视图,并在其下添加子视图。然后,您可以从超级视图中微调管理事件,这些超级视图可以处理单点触摸(当另一个视图添加到顶端时不会取消,因为现在将其添加到下方) – Aggressor 2015-01-20 23:23:21

+0

感谢链接@Aggressor。任何方式,你可以告诉我如何以你的方式做到这一点?随意使用我的代码,或者只是粘贴一个要点,如果你自己的代码,我可以弄明白。 – 2015-01-20 23:24:50

回答

0

这是一种可能性,但我愿意提供更好的建议。

  1. 添加一个“母版视图”上的你需要触摸事件
  2. 手势识别添加到该视图
  3. 手势内处理的逻辑,你现在是顶部,但子视图需要需要添加到接收触摸的视图下方。
  4. 您现在可以在用户举起手指时获得.ended状态。

谨慎的话。如果您的视图有其他触摸事件,请确保此“主视图”未超过它们,因为它会拦截这些事件并为其姿势拦截(除非您将它设置为同时识别它们)。如果是这种情况,你可以使这个'主视图'只是一个小屏幕的端口,你需要不间断地监听触摸事件

+0

Thanks Aggressor。如果你可以给这个答案增加一些代码,我认为它可以在未来帮助很多人。我最感兴趣的是#3,在接受触摸的下方添加子视图 – 2015-01-20 23:38:24

+0

如果您需要特定的帮助,我建议通过SO来查看或询问另一个具体问题。 – Aggressor 2015-01-21 00:22:17