斯威夫特:电影播放取消长按。我如何坚持长按?

时间:2015-01-20 23:05:06

标签: swift ios8 mpmovieplayercontroller mpmovieplayer long-press

我正在构建一些类似于SnapChat的功能。按住一个视图,它会显示要播放的电影,然后在电影结束(当前正在工作)时,或当用户拿起他们的手指(不工作)时返回主视图控制器。这就是这个问题是关于)。

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

我希望状态在用户抬起手指之前不要改变,这应该将UIGestureRecognizerState注册为Ended

关于如何做到这一点的任何提示都会很棒。谢谢!

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)

    }
}

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

所以这是一个完全侥幸,但我想出了如何在这种情况下做到这一点。

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

不完全确定为什么会起作用,但它适用于我的背景。

1 个答案:

答案 0 :(得分:0)

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

  1. 在您需要触摸事件的位置添加“主视图”
  2. 将手势识别器添加到该视图
  3. 像现在一样处理手势中的逻辑,但需要添加的子视图需要添加到接收触摸的视图下方。
  4. 当用户抬起手指时,您现在可以获得.ended状态。
  5. 谨慎。如果您的视图有其他触摸事件,请确保此“主视图”不会超过它们,因为它将拦截这些事件并将其占用为其手势(除非您将其设置为同时识别它们)。如果是这种情况,您可以将此“主视图”仅设置为屏幕的一个小端口,您需要不间断地监听触摸事件