Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特:长按被电影播放取消。我如何坚持长期的压力?_Swift_Ios8_Mpmovieplayercontroller_Mpmovieplayer_Long Press - Fatal编程技术网

Swift 斯威夫特:长按被电影播放取消。我如何坚持长期的压力?

Swift 斯威夫特:长按被电影播放取消。我如何坚持长期的压力?,swift,ios8,mpmovieplayercontroller,mpmovieplayer,long-press,Swift,Ios8,Mpmovieplayercontroller,Mpmovieplayer,Long Press,我正在构建一些类似于SnapChat的功能。按住一个视图,它会显示一个要播放的电影,然后在电影结束(当前正在播放)或用户拿起手指(未播放)时返回主视图控制器,这就是这个问题的内容 我的问题在于IBAction,当视频出现时,UIgestureRecognitizerState从开始更改为取消 我希望在用户抬起手指之前状态不会改变,手指应注册为uigesturecognizerstateasend 任何关于如何做到这一点的提示都将非常棒。谢谢 class ViewController: UIVie

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

我的问题在于IBAction,当视频出现时,
UIgestureRecognitizerState
开始
更改为
取消

我希望在用户抬起手指之前状态不会改变,手指应注册为
uigesturecognizerstate
as
end

任何关于如何做到这一点的提示都将非常棒。谢谢

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
功能中删除了行
presentmovieplayervicecontrolleranimated(moviePlayer)


不完全清楚为什么会这样,但它对我的环境有效。

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

  • 在需要触摸事件的位置上方添加“主视图”
  • 将手势识别器添加到该视图中
  • 像现在一样处理手势中的逻辑,但是需要添加的子视图需要添加到接收触摸的视图下方
  • 现在,当用户抬起手指时,您可以获得.end状态

  • 警告一句。如果您的视图有其他触摸事件,请确保此“主视图”不在这些事件之上,因为它将拦截这些事件并占用这些事件的手势(除非您将其设置为同时识别它们)。如果是这样的话,您可以将此“主视图”设置为屏幕的一个小端口,您需要在其中不间断地收听触摸事件

    我遇到了一个“类似”问题。不是同一件事,但它涉及到从一个长手势到一个拖拉手势。它不会回答你的问题,但我会说我没有办法通过这个手势。我认为您最好的选择是添加一个带有手势侦听器的超级视图,并在其下方添加子视图。然后你可以从超级视图微观管理事件,它可以处理一次触摸(当另一个视图添加到顶部时不会取消,因为现在你将它添加到下面)感谢@Aggressor链接。你能告诉我怎么用你的方式做吗?请随意使用我的代码,或者只是粘贴一个要点,如果你有自己的代码,我可能会想出来。可能会有太多的代码无法粘贴,但我会发布一个简单的答案(但这可能不是你的最佳选择)。我想对这个问题的一个一般性的答案对将来喜欢这篇文章的人真的很有帮助。我也很乐意为这个问题做出贡献,一旦我完全了解这个问题以及如何解决它。(我是Swift的新手,所以这对我来说是一个全新的概念)谢谢侵略者。如果你能在这个答案中添加一些代码,我认为它可以在将来帮助很多人。我最感兴趣的是#3,将子视图添加到接收触摸的子视图下面。如果您需要像这样的特定帮助,我建议您查看该子视图或询问其他特定问题。