Swift:长按被电影播放取消。如何坚持长按?

Posted

技术标签:

【中文标题】Swift:长按被电影播放取消。如何坚持长按?【英文标题】:Swift: Long press cancelled by movie playing. How do I persist the long press? 【发布时间】:2015-01-20 23:05:05 【问题描述】:

我正在构建一些类似于 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)

    

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

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

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

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

【问题讨论】:

我遇到了一个“类似”的问题。不是一回事,但它涉及从长手势到拖动手势***.com/questions/27790899/… 它不会回答你的问题,但我会说我找不到通过手势的方法。我认为您最好的选择是添加带有手势侦听器的超级视图并在其下方添加子视图。然后你从可以处理一次触摸的超级视图中对事件进行微观管理(当另一个视图被添加到顶部时不会被取消,因为现在你将它添加到下面) 感谢@Aggressor 的链接。你有什么方法可以告诉我如何以对你有用的方式做到这一点?随意使用我的代码,或者如果你自己的代码只是粘贴一个要点,我可能会弄明白。 粘贴的代码太多,但我会发布一个演练答案(但这可能不是您的最佳选择) 我认为这个问题的一般性答案可能对未来关注这篇文章的人非常有帮助。一旦我完全解决了这个问题以及如何解决它,我也很乐意为它做出贡献。 (我是 Swift 的新手,所以这对我来说是一个全新的概念) 【参考方案1】:

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

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

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

【讨论】:

感谢侵略者。如果您可以在此答案中添加一些代码,我认为它将来可以帮助很多人。我对#3 最感兴趣,在接收触摸的那个下方添加子视图 如果您需要这样的具体帮助,我建议您查看 SO 或询问其他具体问题。

以上是关于Swift:长按被电影播放取消。如何坚持长按?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift iOS 中禁用 UITextField 双击或长按? [复制]

Swift 长按结果

苹果手机长按home键是啥功能

在蓝牙设备上处理长按媒体按钮播放/暂停

长按手势识别器产生重复位置 (SWIFT)

艺术家C. Cassandra的漫画系列:女人的日常