【问题标题】:Disable swipe to close on AVPlayerController在 AVPlayerController 上禁用滑动关闭
【发布时间】:2017-10-09 09:40:20
【问题描述】:

iOS 11 引入了滑动来关闭 AVPlayerController。我有针对幼儿的应用程序,因此屏幕很容易滑动,导致视频关闭。有没有办法去掉关闭播放器的手势?

我尝试向 AVPlayerController 的视图添加手势覆盖,但它不起作用。 How can I add Swipe Gesture to AVPlayer in swift 3 上有可能的解决方案,但必须有更清洁的方法

【问题讨论】:

  • 您不应该使用 AVPlayerController,您必须使用 AVPlayer 编写自己的视频播放器实现。
  • 为什么不应该使用 AVPlayerController?我们使用了它的很多内置功能,因此目前编写我们自己的实现是不可行的
  • 如果您找到解决方案,请告诉我。我也在寻找禁用滑动关闭的方法
  • 我设法修复了它。刚刚添加了一个答案来解释。希望有帮助

标签: swift ios11 avplayerviewcontroller


【解决方案1】:

如果嵌入了 AVPlayerController(不显示),则关闭按钮不会显示在控件视图中。

我的解决方案是找到带有手势识别器的子视图并删除平移手势识别器

for v in playerViewController.view.subviews {
     if v.gestureRecognizers != nil {
         for gr in v.gestureRecognizers! {
             if gr is UIPanGestureRecognizer {
                // remove pan gesture to prevent closing on pan
                v.removeGestureRecognizer(gr)
             }
         }
     }
}

【讨论】:

  • 它找到并删除了 gr 但平移继续工作
【解决方案2】:

我设法解决了问题。正如@Vakas 评论的那样,不应将 AVPlayerController 子类化。我最初对它进行了子类化并使用模态segue 呈现。这是导致问题的原因。

为了解决这个问题,我创建了另一个视图控制器,其中嵌入了 AVPlayerController。

import UIKit
import AVKit

class PlayerViewController: UIViewController, AVPlayerViewControllerDelegate {

    var videoRecord: Video!
    var presentingController = ""
    var videos = [Video]()
    var presentingPlaylist:  Playlist?

    let playerViewController = TFLPlayerController()


    override func viewDidLoad() {
        super.viewDidLoad()

        playerViewController.delegate = self

        playerViewController.videoRecord = videoRecord
        playerViewController.videos = self.videos
        playerViewController.allowsPictureInPicturePlayback = false

        // Add the original AVPlayerController in here
        self.addChildViewController(playerViewController)

        let playerView = playerViewController.view
        playerView?.frame = self.view.bounds

        self.view.addSubview(playerView!)
        playerViewController.didMove(toParentViewController: self)

    }

}

我基本上是用这个ViewController来把视频等属性传递给原本子类化的AVPlayerController。

【讨论】:

    【解决方案3】:

    上述 cmets 均未解决此问题(iOS 13+)。解决方案:

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
    avPlayerViewController.view.addGestureRecognizer(panGestureRecognizer)
    

    其中,handlePanGesture(_:) 是在屏幕上发生平移时将调用的方法(并且视频不会移动 - 这是它被拖动的问题中的问题),而 avPlayerViewController 是 AVPlayerViewController实例。

    注意:如果您想防止捏合/旋转和任何其他手势,您可以为每个手势添加一个新的 UI...GestureRecognizer。只需确保所有 UI...GestureRecognizers 的委托都已设置,并且此功能已实现:

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2023-03-24
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多